繁体   English   中英

首次使用numpy打“ ValueError:零维数组无法连接”

[英]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数组并不常见,但有助于在它们发生时了解它们。 遇到错误或意外结果时,养成检查数组shapedtype的习惯。


有一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM