2013-09-23 2 views
0

У меня есть три массива равной длины с именем ra, ma и op, в основном числа и несколько экземпляров, когда у них есть «nan» или «None» вместо номера. Например:Python: ошибка при построении трехмерного графика из 3 массивов

ra = [0, 1, 2, nan, 8 , 3, 8, 5] 
ma = [3, nan, 5, 8, 9, 6, 4, 10] 
op = [7, None, 7, 9, 3, 6, None, 7] 

Я хочу сделать 3d график чисел в них. Мой код:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(ra,ma,op) 

plt.show() 

Все хорошо, пока я печатаю plt.show() - то это дает мне длинный список ошибок, который заканчивается так:

"TypeError: unsupported operand type(s) for /: 'NoneType' and 'NoneType'". 

Может быть: Это из-за значений nan, но я не знаю, как их удалить: - Если я хочу удалить значение nan из ra (что является 4-м значением списка), мне также придется удалить соответствующие 4-е значения из ma и op. И я не могу понять, как это сделать, или если нам вообще нужно это делать.

Может кто-нибудь указать, где я иду не так?

+0

Ошибка довольно ясна; это не * жалуется на 'nan', а на' None'. – Bakuriu

+0

Можно ли удалить значения None из списка «op», а также удалить соответствующие значения из «ra» и «ma»? Я имею в виду, это должно быть возможно, но я не знаю, как поставить цикл for, чтобы рассмотреть все эти три массива. – Panchi

+2

Использование 'itertools.compress' довольно просто:' op, ma, ra = zip (* compress (zip (op, ma, ra), op)) '(это предполагает, что' op' не содержит нулей. В противном случае замените 'op' на' (x не является None для x в op) '. Использование явного цикла вы можете сделать 'для a, b, c в zip (ra, ma, op)' проверить, если 'c не является None', в этом случае вставьте' a', 'b' и' c' в некоторые новые списки. – Bakuriu

ответ

2

Вы могли бы избавиться от колонн с None в них, как это (в любом Python 2.7 или 3+):

from __future__ import print_function 
try: 
    from itertools import izip 
except ImportError: 
    izip = zip 

ra = [0, 1, 2, float('nan'), 8 , 3, 8, 5] 
ma = [3, float('nan'), 5, 8, 9, 6, 4, 10] 
op = [7, None, 7, 9, 3, 6, None, 7] 

ra, ma, op = izip(*(col for col in izip(ra, ma, op) if None not in col)) 

print('ra =', ra) 
print('ma =', ma) 
print('op =', op) 

Выход:

ra = (0, 2, nan, 8, 3, 5) 
ma = (3, 5, 8, 9, 6, 10) 
op = (7, 7, 9, 3, 6, 7) 

Как @Bakuriu упоминалось в комментариях, возможно, лучше использовать функцию compress(), которая находится во встроенном модуле itertools и поэтому, вероятно, будет быстрее. Он также устраняет относительно медленный линейный поиск через каждый столбец значений выше.

from itertools import compress 
ra, ma, op = izip(*compress(izip(ra, ma, op), (x is not None for x in op))) 
Смежные вопросы