Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 为什么我不能用单列矩阵替换NumPy数组中的一列?_Python_Arrays_Numpy_Matrix_Linear Algebra - Fatal编程技术网

Python 为什么我不能用单列矩阵替换NumPy数组中的一列?

Python 为什么我不能用单列矩阵替换NumPy数组中的一列?,python,arrays,numpy,matrix,linear-algebra,Python,Arrays,Numpy,Matrix,Linear Algebra,我遇到了NumPy数组的一个奇怪行为。我正在研究一些矩阵代数示例,我发现可以很容易地用各种类型的数据替换数组列(或行),但不能使用具有正确行数和单列数的数组 让我们创建一个数组: >>> import numpy as np >>> >>> A = np.zeros([4,4]) >>> A array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0

我遇到了NumPy数组的一个奇怪行为。我正在研究一些矩阵代数示例,我发现可以很容易地用各种类型的数据替换数组列(或行),但不能使用具有正确行数和单列数的数组

让我们创建一个数组:

>>> import numpy as np
>>>
>>> A = np.zeros([4,4])
>>> A
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
现在,让我们为行/列指定一些值:

>>> A[0,:] = [1,1,1,1]
>>> A
array([[1., 1., 1., 1.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
>>>
>>> A[:,0] = np.array([2,2,2,2])
>>> A
array([[2., 1., 1., 1.],
       [2., 0., 0., 0.],
       [2., 0., 0., 0.],
       [2., 0., 0., 0.]])
>>>
>>> A[2,:] = np.array([[3,3,3,3]])
>>> A
array([[2., 1., 1., 1.],
       [2., 0., 0., 0.],
       [3., 3., 3., 3.],
       [2., 0., 0., 0.]])
>>>
>>> A[:,2] = np.array([[4,4,4,4]])
>>> A
array([[2., 1., 4., 1.],
       [2., 0., 4., 0.],
       [3., 3., 4., 3.],
       [2., 0., 4., 0.]])
在最后两次替换中,我将1x4数组指定为新行,将1x4数组指定为新列。 但由于未知原因,我无法将数组4x1分配给现有数组的列或行:

>>> A[:,3] = np.array([[5],[5],[5],[5]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (4,1) into shape (4,)
>>A[:,3]=np.array([[5],[5],[5],[5])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:无法将输入数组从形状(4,1)广播到形状(4,)
我用谷歌搜索了错误,我仍然认为这可能是一个设计缺陷


是否有实际理由不允许将
Nx1
数组作为列分配给
NxM
数组?

如果需要广播,请使用:

>>> A
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

>>> A[:,3:4] = np.array([[5],[5],[5],[5]])
>>> A
array([[0., 0., 0., 5.],
       [0., 0., 0., 5.],
       [0., 0., 0., 5.],
       [0., 0., 0., 5.]])
A[:,3]
的形状是
(n,)
,即
1-D数组
,而
A[:,3:4]
的形状是
(n,1)
,与您试图分配的数组相同

>>> A[:, 3]
array([0., 0., 0., 0.])
>>> A[:, 3].shape
(4, )

>>> A[:, 3:4]
array([[0.],
       [0.],
       [0.],
       [0.]])

>>> A[:, 3:4].shape
(4, 1)
区别在于,
3
只是一个整数,而不是一个索引,
3:4
是一个
切片
对象,
切片(3,4,无)
,你可以这样想,你是沿着轴1切片一个部分,而不是只拾取一个索引

编辑:

或者,可以在列表中沿轴1传递索引:

>>> A[:, [3]] = np.array([[5],[5],[5],[5]])
>>> A
array([[0., 0., 0., 5.],
       [0., 0., 0., 5.],
       [0., 0., 0., 5.],
       [0., 0., 0., 5.]])

要了解更多信息,请查看公认答案的附录:

制作两个阵列,一个为1d,另一个为2d(但元素数量相同):

当我们添加它们时,我们得到一个(4,4)结果:

根据广播规则,两个阵列必须具有相同的维数。它可以自动添加前导尺寸,将(4,)旋转为(1,4):

根据第二条规则,调整大小1的维度,因此(1,4)=>(4,4)和(4,1)=>(4,4),生成(4,4)数组

通过赋值,RHS可以添加前导尺寸并调整1。但LHS基本不变:

In [78]: x[:] = y
Traceback (most recent call last):
  File "<ipython-input-78-4f264a106454>", line 1, in <module>
    x[:] = y
ValueError: could not broadcast input array from shape (4,1) into shape (4)
或将其更改为(4,):

或将LHS更改为(4,1):

接受的答案有效地完成了最后一个
A[:,[3]]

我本来想说LHS是不能改变的,但是将(1,4)赋值给(4,)的能力让我犹豫了。将(1,4)指定给(4,)时,左侧是否调整为(1,4)(自动前导尺寸),或者右侧是否将(1,4)更改为(4,)。细节可能无关紧要。关键是不能添加(或删除)尾随尺寸


需要前后尺寸之间的差异以避免歧义。想象一下,尝试添加一个(3,)和(4,)。这会导致(3,4)或(4,3)吗?(3,1)+(1,4)或(1,3)+(4,1)。对于前导规则,您必须明确,添加一个(3,1)+(4,)或(3,)+(4,1)。

您对
广播规则的理解程度如何?
?不太清楚,因为我现在似乎已经发现了这一点……谢谢,我已经尝试过这种方法,但用slice对象处理单个列对我来说似乎不太直观(简单地说:我只是不想用两个数字来处理单个项目)。@JanMelichařík现在它是一个数字。我明白了,这看起来更好。谢谢!但是我仍然有点困惑为什么它适用于1x4阵列。我需要读一点关于广播的知识。广播时,numpy尝试对齐最右边的维度。所以
(4),
(1,4)
可以,而
(4,)
(4,1)
则不行。这是一个非常有用的解释,非常感谢!我没有意识到我可以用这种方式处理维度。这对我来说现在更有意义。你认为替换矩阵中大量列的最佳方法(蒙特卡罗算法)是什么?到目前为止,我在大多数脚本中都使用了
A[:,[3]]
In [76]: x+y
Out[76]: 
array([[11, 11, 11, 11],
       [11, 11, 11, 11],
       [11, 11, 11, 11],
       [11, 11, 11, 11]])
In [77]: x[None,:]+y
Out[77]: 
array([[11, 11, 11, 11],
       [11, 11, 11, 11],
       [11, 11, 11, 11],
       [11, 11, 11, 11]])
In [78]: x[:] = y
Traceback (most recent call last):
  File "<ipython-input-78-4f264a106454>", line 1, in <module>
    x[:] = y
ValueError: could not broadcast input array from shape (4,1) into shape (4)
In [79]: x[:] = y.T
In [80]: x
Out[80]: array([10, 10, 10, 10])
In [81]: x[:] = y.ravel()
In [83]: x[:,None] = y