[英]Using numpy for first time hit “ValueError: zero-dimensional arrays cannot be concatenated”
今天,我安装了第一个软件包numpy,并想尝试一下。 所以我找到了这篇文章, 贝叶斯定理在python中的实现 ,并想尝试一下。 我遇到一个错误:
码:
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语句)。
任何答案/评论将不胜感激。
您需要在zip
功能上调用list
。 在python 3中, zip返回一个迭代器。
这里:
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])
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
仅生成一个1d数组。
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之类的内容之前先查看整个内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.