第一次使用numpy命中“ValueError:无法连接零维数组”

时间:2018-01-22 00:28:34

标签: python python-3.x numpy concatenation

今天我安装了我的第一个包,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语句)。

任何答案/评论都将不胜感激。

2 个答案:

答案 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数组并不常见,但在它们发生时有助于理解它们。当您收到错误或意外结果时,养成检查数组shapedtype的习惯。

有一个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之类的东西之前会查看整个事情。