Python 创建数组时被奇数错误迷惑
与 为什么Python 创建数组时被奇数错误迷惑,python,arrays,numpy,Python,Arrays,Numpy,与 为什么 foo_ok = [(30, 784), (10, 30)] foo_bad = [(10, 784), (10, 10)] 工作时间 np.array([np.zeros(foo_ok[0]),np.zeros(foo_ok[1])]) 导致 ValueError:无法将输入数组从形状(10784)广播到形状(10) 基本上,我需要使用foo=[(X,Z),(Y,X)]形式的东西,这里可能是Y==X;但是拥有Y==X会导致失败。根据编辑的问题编辑答案 基本上,问题取决于第一个轴
foo_ok = [(30, 784), (10, 30)]
foo_bad = [(10, 784), (10, 10)]
工作时间
np.array([np.zeros(foo_ok[0]),np.zeros(foo_ok[1])])
导致
ValueError:无法将输入数组从形状(10784)广播到形状(10)
基本上,我需要使用
foo=[(X,Z),(Y,X)]
形式的东西,这里可能是Y==X
;但是拥有Y==X
会导致失败。根据编辑的问题编辑答案
基本上,问题取决于第一个轴何时与两个阵列匹配。下面是一个可复制的示例:
np.array([np.zeros(foo_bad[0]),np.zeros(foo_bad[1])])
如果我们构建前2个阵列:
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
此处foo_ok2[0]
和foo_ok2[1]
具有相同的值,因此,它将创建两个形状相同的数组。Numpy足够聪明,可以在两个具有相同维度的数组出现时处理数组连接,并且生成的b
数组是形状(2,30784)
的连接。但是,生成的数组a
只是一个类型为object
的数组,包含2个元素。列表的每个元素都是一个不同的数组(就像它是一个原始python列表一样)
Numpy没有优化以处理对象
数组,因此,只要可能,它就会尝试将数组转换为数字数据类型
这就是发生的情况,然后两个数组的第一个维度在c
中匹配。Numpy希望所有维度都匹配,因此抛出一个I无法连接这个异常
尽管我仍然鼓励不要在对象类型中使用numpy数组,但即使第一个轴匹配,而数组具有不同的形状,也有一种肮脏的方法可以创建一个:
>>> 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)
和它的另一个版本(与您的语法密切相关):
等一下。我的错误可能在别处。在你进一步投资之前,让我先回顾一下。@raxacoricofallapatorius刚刚编辑了一些可能有用的东西。可能是zero
->zero\u喜欢
?编辑以简化并使问题更清楚zero\u like
不起作用。我正在寻找与我使用foo_ok
得到的等价物,只是将相关维度从30更改为10。基本上,我需要使用foo=[(X,Z),(Y,X)]
形式的东西,可能是Y==X
。但是我不明白为什么拥有Y==X
会导致事情失败。@raxacoricofallapatorius简言之,你不应该拥有这种类型的numpy数组。Numpy没有优化以处理对象
数组。为此,请使用原始python列表。
>>> 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)