今天我安装了我的第一个包,numpy,想要尝试一下。所以我找到了 这篇文章Bayes’ theorem implementation in python,并想进行实验。我遇到了一个错误:
CODE:
import numpy as np
x_red = np.array([1,2,3])
y_red = np.array([1,2,3])
z_red = np.array([1,2,3])
red_points = np.array(zip(x_red,y_red,z_red))
x_blue = np.array([1,2,3])
y_blue = np.array([1,2,3])
z_blue = np.array([1,2,3])
blue_points = np.array(zip(x_blue,y_blue,z_blue))
points = np.concatenate([red_points,blue_points])
最后一行的错误:
Traceback (most recent call last):
File "C:\Users\Mike\AppData\Local\Programs\Python\Python36-32\tmp.py", line 19, in <module>
points = np.concatenate([red_points,blue_points])
ValueError: zero-dimensional arrays cannot be concatenated
我原本希望将numpy作为黑盒子运行,但是作为python的新手不知道如何调试'包错误'。
可能是python 3.6改变了一些东西(代码使用了旧的print语句)。
任何答案/评论都将不胜感激。
答案 0 :(得分:2)
您需要在import numpy as np
x_red = np.array([1,2,3])
y_red = np.array([1,2,3])
z_red = np.array([1,2,3])
red_points = np.array(list(zip(x_red,y_red,z_red))) # <- here
x_blue = np.array([1,2,3])
y_blue = np.array([1,2,3])
z_blue = np.array([1,2,3])
blue_points = np.array(list(zip(x_blue,y_blue,z_blue))) # <- and here
points = np.concatenate([red_points,blue_points])
功能上调用transactionObject
。在python 3中zip返回一个迭代器。
<强>这里:强>
transactionObject
答案 1 :(得分:2)
np.array
采用类似列表的迭代,但不是迭代器或生成器。
In [26]: red_points = np.array(zip(x_red,y_red,z_red))
In [27]: red_points
Out[27]: array(<zip object at 0xab7d9b2c>, dtype=object)
结果是一个包含一个项目的0d数组,即zip对象。在Py2中,zip
生成了一个列表,在Py3中你必须list
。
In [28]: red_points = np.array(list(zip(x_red,y_red,z_red)))
In [29]: red_points
Out[29]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
np.array(...)
会获取Out[29]
中显示的列表。这是使用它的最常用方式之一。
像这样使用zip(...)
实际上是一种转置输入的方法。 numpy
也可以进行转置:
In [31]: red_points = np.array((x_red,y_red,z_red))
In [32]: red_points
Out[32]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
In [33]: red_points.T
Out[33]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
np.stack
也有效。默认情况下,axis=0
的行为与np.array
类似。
In [34]: red_points = np.stack((x_red,y_red,z_red),axis=1)
In [35]: red_points
Out[35]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])
虽然0d数组并不常见,但在它们发生时有助于理解它们。当您收到错误或意外结果时,养成检查数组shape
和dtype
的习惯。
有一个fromiter
可以与迭代器一起使用,但需要dtype
- 并且只生成一个数组。
In [39]: np.fromiter(zip(x_red,y_red,z_red),'i,i,i')
Out[39]:
array([(1, 1, 1), (2, 2, 2), (3, 3, 3)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
np.array
期望完整列表的部分原因是它在决定dtype和shape之类的东西之前会查看整个事情。