Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建数组时被奇数错误迷惑_Python_Arrays_Numpy - Fatal编程技术网

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)