创建数组时出现奇数错误

2024-04-27 02:23:42 发布

您现在位置:Python中文网/ 问答频道 /正文

foo_ok = [(30, 784), (10, 30)]
foo_bad = [(10, 784), (10, 10)]

为什么会这样

np.array([np.zeros(foo_ok[0]),np.zeros(foo_ok[1])])

工作时

np.array([np.zeros(foo_bad[0]),np.zeros(foo_bad[1])])

结果

ValueError: could not broadcast input array from shape (10,784) into shape (10)

基本上我需要使用foo = [(X, Z), (Y, X)]形式的东西,在这种情况下Y==X;但是拥有Y==X会导致失败。你知道吗


Tags: frominputfoonpzerosnotokarray
1条回答
网友
1楼 · 发布于 2024-04-27 02:23:42

根据编辑的问题编辑答案。你知道吗

基本上,问题取决于第一个轴何时与两个数组匹配。下面是一个可复制的例子:

foo_ok = [(30, 784), (10, 30)]
foo_ok2 = [(30, 784), (30, 784)]
foo_bad = [(10, 784), (10, 10)]

如果我们构造前两个数组:

a = np.array([np.zeros(foo_ok[0]),np.zeros(foo_ok[1])])
b = np.array([np.zeros(foo_ok2[0]),np.zeros(foo_ok2[1])])

c = np.array([np.zeros(foo_bad[0]),np.zeros(foo_bad[1])]) # ERROR

我们可以看到,得到的数组并不相同:

>>> print a.shape, a.dtype, a[0].shape, a[1].shape
(2,), dtype('O'), (30, 784), (10, 30)

>>> print b.shape, b.dtype, b[0].shape, b[1].shape
(2, 30, 784), dtype('float64'), (30, 784), (30, 784)

这里foo_ok2[0]foo_ok2[1]具有相同的值,因此,它将创建两个形状相同的数组。Numpy足够聪明,可以在两个维度相同的数组出现时处理数组连接,结果b数组是形状(2, 30, 784)的连接。但是,得到的数组a只是一个object类型的数组,包含2个元素。列表中的每个元素都是一个不同的数组(就像它是一个原始python列表一样)。你知道吗

Numpy没有针对object数组进行优化,因此,只要可能,它都会尝试将数组转换为数值数据类型。你知道吗

这就是2个数组的第一个维度在c中匹配的情况。Numpy期望所有维度都匹配,因此抛出I cannot concatenate this异常。你知道吗


尽管我仍然鼓励不要在对象类型中使用numpy数组,但是有一种方法可以创建一个,即使第一个轴匹配,而数组有不同的形状:

>>> c = np.array([np.zeros(foo_bad[0]), None])
>>> c[1] = np.zeros(foo_bad[1])

>>> print c.shape, c.dtype, c[0].shape, c[1].shape
(2,), dtype('O'), (10, 784), (10, 10)

以及它的另一个版本(与您的语法密切相关):

>>> c = np.empty((2,), dtype=np.object)
>>> c[:] = [np.zeros(foo_bad[0]), np.zeros(foo_bad[1])]

>>> print c.shape, c.dtype, c[0].shape, c[1].shape
(2,), dtype('O'), (10, 784), (10, 10)

相关问题 更多 >