Python:从3个数组绘制3d图时出错

时间:2013-09-23 16:48:18

标签: python 3d mplot3d

我有三个等长的数组,名为ra,ma和op,其中大部分数字为,当有'nan'或'None'代替数字时,它们很少。 例如:

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值,但我不知道如何删除它们: - /如果我想从ra中移除nan值(这是列表的第4个值),我还必须删除相应的第4个值来自ma和op。我无法弄清楚如何做到这一点,或者我们是否需要这样做。

有人可以指出我哪里出错吗?

1 个答案:

答案 0 :(得分: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)))