python - 使用索引数组广播 numpy 矩阵

标签 python numpy array-broadcasting

我有这些 numpy 对象:

>>> x = np.matrix([[1],[2],[3]])
>>> i = ([1,2],0)
>>> y = np.matrix([[4],[5]])

当我执行x[i]时,我得到了我所期望的:

>>> x[i]
matrix([[2],
        [3]])

但是,当我尝试分配给 x[i] 时,我得到了奇怪的行为:

>>> x[i] = y
ValueError: array is not broadcastable to correct shape
>>> y.shape
(2, 1)
>>> x[i].shape
(2, 1)

我已经找到了一些解决方法,但它们只是解决方法,而不是我想要的:

>>> x[1:,0] = y
>>> x
matrix([[1],
        [4],
        [5]])
>>> x = np.array([[1],[2],[3]]); y = np.array(y)
>>> x[i] = y[:,0]
>>> x
array([[1],
       [4],
       [5]])

第二种解决方法是 Not Acceptable ,因为 y 可能具有比列向量更通用的形状。

最佳答案

不要使用numpy.matrix。它是可怕的。它会导致许多奇怪的不兼容性,并且有许多不一致的地方,包括这个。

使用numpy.array。对于数组,x[i] 是一维的,将形状相同的一维 y 分配给 x[i] 就可以了很好。

import numpy

x = numpy.array([[1], [2], [3]])
y = numpy.array([4, 5])
i = ([1, 2], 0)

print(x[i].shape)
print(y.shape)

x[i] = y

print(repr(x))

Output :

(2,)
(2,)
array([[1],
       [4],
       [5]])

如果您想进行矩阵乘法,请使用 @ 运算符,或者如果您使用的 Python 版本太旧或 NumPy 版本太旧,请使用 dot 方法拥有@

关于python - 使用索引数组广播 numpy 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44057142/

相关文章:

Python "IN PLACE"函数

Python 中值滤波器应用于 3D 数组以产生 2D 结果

python - 该函数的完美 numpy 实现

python - 为什么这两个 numpy.divide 运算会给出如此不同的结果?

python - 沿 B 广播 A 的每一行,避免 `repeat`

python - 从 Django 的类外部使用 super() (或替代它,如果有的话)

Python 3 网络抓取工具非常简单,无法正常工作

python - 用于近似像素颜色变化的嵌套 For 循环的 Numpy 等效项

python - Flask 在内部引发了哪些状态代码?

python - 使用 Numpy 数组、元组和省略号进行 bool 索引