乘以大型二维 numpy 数组
multiplying large 2D numpy arrays
我想以最有效的方式乘以下列矩阵(使用 numpy)。
这是矩阵的代码:
a = np.array([[1, 5], [2, 6], [3, 7], [4, 8]])
m = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 1]])
这些是可视化效果更好的矩阵:
a:
[[1 5]
[2 6]
[3 7]
[4 8]]
m:
[[1 0 0 1]
[1 0 1 0]
[0 1 0 1]
[0 1 1 1]]
我想将a乘以(矩阵m的第一列),像这样
a m[:,0] x0
[[1 5] [[1] [[1 5]
[2 6] * [1] = [2 6]
[3 7] [0] [0 0]
[4 8]] [0]] [0 0]
然后我想将a乘以(矩阵m的第二列),像这样
a * m[:,1] = x1
然后是第3列和第4列
a * m[:,2] = x2
a * m[:,3] = x3
最后,我想将生成的矩阵 x0、x1、x2、x3 全部放在一个矩阵中。
X = [x0, x1, x2, x3]
本例中的尺寸 X 为 4 x 8。
本例最终结果为:
X =
[[[1 5 0 0 0 0 1 5]
[2 6 0 0 2 6 0 0]
[0 0 3 7 0 0 3 7]
[0 0 4 8 4 8 4 8]]
我想知道如何使用 numpy 的内置函数和生成器来执行此操作,而不是使用 2 个 for 循环(如果可能的话)。
这只是一个例子。实际上,矩阵的维度很大,乘法尽可能快地完成很重要。
谢谢
您可以转置和扩展 m
的维度以获得想要的结果:
m.T[...,None] * a
array([[[1, 5],
[2, 6],
[0, 0],
[0, 0]],
[[0, 0],
[0, 0],
[3, 7],
[4, 8]],
...
如果要水平堆叠数组以得到 2D
数组,请使用 np.hstack
:
np.hstack(m.T[...,None] * a)
array([[1, 5, 0, 0, 0, 0, 1, 5],
[2, 6, 0, 0, 2, 6, 0, 0],
[0, 0, 3, 7, 0, 0, 3, 7],
[0, 0, 4, 8, 4, 8, 4, 8]])
或重塑为:
(a[:,None] * m[...,None]).reshape(m.shape[0], -1)
这就是我一直在寻找的答案。谢谢 Yatu 和 hpaulj。
X = m.T[...,None] * a
for i in range(4):
reshaped = np.hstack(X[i,:,:])
reshaped_simpler = np.hstack(X)
print (reshaped_simpler)
我从以下 link 中得到了其余答案:
我重新安排了 for 循环,因为我收到了一条关于生成器将在 Numpy 的未来版本中被弃用的警告。
你可以通过broadcast和reshape来实现
arr_out = (a[:,None] * m[...,None]).reshape(4,8)
Out[176]:
array([[1, 5, 0, 0, 0, 0, 1, 5],
[2, 6, 0, 0, 2, 6, 0, 0],
[0, 0, 3, 7, 0, 0, 3, 7],
[0, 0, 4, 8, 4, 8, 4, 8]])
我想以最有效的方式乘以下列矩阵(使用 numpy)。
这是矩阵的代码:
a = np.array([[1, 5], [2, 6], [3, 7], [4, 8]])
m = np.array([[1, 0, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 1, 1]])
这些是可视化效果更好的矩阵:
a:
[[1 5]
[2 6]
[3 7]
[4 8]]
m:
[[1 0 0 1]
[1 0 1 0]
[0 1 0 1]
[0 1 1 1]]
我想将a乘以(矩阵m的第一列),像这样
a m[:,0] x0
[[1 5] [[1] [[1 5]
[2 6] * [1] = [2 6]
[3 7] [0] [0 0]
[4 8]] [0]] [0 0]
然后我想将a乘以(矩阵m的第二列),像这样
a * m[:,1] = x1
然后是第3列和第4列
a * m[:,2] = x2
a * m[:,3] = x3
最后,我想将生成的矩阵 x0、x1、x2、x3 全部放在一个矩阵中。
X = [x0, x1, x2, x3]
本例中的尺寸 X 为 4 x 8。
本例最终结果为:
X =
[[[1 5 0 0 0 0 1 5]
[2 6 0 0 2 6 0 0]
[0 0 3 7 0 0 3 7]
[0 0 4 8 4 8 4 8]]
我想知道如何使用 numpy 的内置函数和生成器来执行此操作,而不是使用 2 个 for 循环(如果可能的话)。
这只是一个例子。实际上,矩阵的维度很大,乘法尽可能快地完成很重要。
谢谢
您可以转置和扩展 m
的维度以获得想要的结果:
m.T[...,None] * a
array([[[1, 5],
[2, 6],
[0, 0],
[0, 0]],
[[0, 0],
[0, 0],
[3, 7],
[4, 8]],
...
如果要水平堆叠数组以得到 2D
数组,请使用 np.hstack
:
np.hstack(m.T[...,None] * a)
array([[1, 5, 0, 0, 0, 0, 1, 5],
[2, 6, 0, 0, 2, 6, 0, 0],
[0, 0, 3, 7, 0, 0, 3, 7],
[0, 0, 4, 8, 4, 8, 4, 8]])
或重塑为:
(a[:,None] * m[...,None]).reshape(m.shape[0], -1)
这就是我一直在寻找的答案。谢谢 Yatu 和 hpaulj。
X = m.T[...,None] * a
for i in range(4):
reshaped = np.hstack(X[i,:,:])
reshaped_simpler = np.hstack(X)
print (reshaped_simpler)
我从以下 link 中得到了其余答案:
我重新安排了 for 循环,因为我收到了一条关于生成器将在 Numpy 的未来版本中被弃用的警告。
你可以通过broadcast和reshape来实现
arr_out = (a[:,None] * m[...,None]).reshape(4,8)
Out[176]:
array([[1, 5, 0, 0, 0, 0, 1, 5],
[2, 6, 0, 0, 2, 6, 0, 0],
[0, 0, 3, 7, 0, 0, 3, 7],
[0, 0, 4, 8, 4, 8, 4, 8]])