gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:57:00 24 4
gpt4 key购买 nike

我遇到了 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,)

我在 google 上搜索了该错误,但我仍然认为这可能是一个设计缺陷。

是否有实际原因不允许将 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 是一个 slice 对象, >slice(3, 4, None),您可以将其视为沿轴 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.]])

要了解更多信息,请查看Broadcasting Rules

关于python - 为什么我不能用单列矩阵替换 NumPy 数组中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66079029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com