首页 > 解决方案 > numpy 列表对二维数组的乘法

问题描述

首先,如果这是明显的重复,请道歉。刚开始使用 numpy,我完全缺乏正确描述我的问题的语言。话虽如此,我正在寻找正确的方法来做到这一点。

我正在尝试将整数列表与 numpy 中二维数组中的相应行相乘。二维数组是一个 10x10 类似棋盘的数组,构建如下:

import numpy as np

# build 10x10 array of zeros
a = np.array([[0]*10]*10)

# checkerboard out the array
a[::2,::2] = 1
a[1::2,1::2] = 1

# Result (so far so good - look at that checkerboard! Woohoo!)
print(a)
[[1 0 1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1 0 1]]

现在,我想建立我的整数范围以与我的 2D 棋盘相乘:

b = np.array(range(5,15))
print(b)
[ 5  6  7  8  9 10 11 12 13 14]

对我来说看起来范围很广,而且有 10 个值长 - 完美!现在,为了解决这个问题,我枚举并遍历b(我的 int 列表),并手动将相应的行与 int 相乘,如下所示:

for i, n in enumerate(b):
    a[i] = a[i] * n

print(a)
[[ 5  0  5  0  5  0  5  0  5  0]
 [ 0  6  0  6  0  6  0  6  0  6]
 [ 7  0  7  0  7  0  7  0  7  0]
 [ 0  8  0  8  0  8  0  8  0  8]
 [ 9  0  9  0  9  0  9  0  9  0]
 [ 0 10  0 10  0 10  0 10  0 10]
 [11  0 11  0 11  0 11  0 11  0]
 [ 0 12  0 12  0 12  0 12  0 12]
 [13  0 13  0 13  0 13  0 13  0]
 [ 0 14  0 14  0 14  0 14  0 14]]

好的!虽然这是我想要实现的并且它有效,但在看到 numpy 在处理这样的数组方面的强大功能之后,这是首选的 numpy 方式吗?

标签: pythonarraysnumpy

解决方案


解决方案1:

(a*b).T

a*b最初将所有列乘以 b 中的相应元素,然后您只需要转置。

array([[ 5,  0,  5,  0,  5,  0,  5,  0,  5,  0],
       [ 0,  6,  0,  6,  0,  6,  0,  6,  0,  6],
       [ 7,  0,  7,  0,  7,  0,  7,  0,  7,  0],
       [ 0,  8,  0,  8,  0,  8,  0,  8,  0,  8],
       [ 9,  0,  9,  0,  9,  0,  9,  0,  9,  0],
       [ 0, 10,  0, 10,  0, 10,  0, 10,  0, 10],
       [11,  0, 11,  0, 11,  0, 11,  0, 11,  0],
       [ 0, 12,  0, 12,  0, 12,  0, 12,  0, 12],
       [13,  0, 13,  0, 13,  0, 13,  0, 13,  0],
       [ 0, 14,  0, 14,  0, 14,  0, 14,  0, 14]])

解决方案2:

b = b.reshape(-1,1) # make it colum vector
a*b

返回

array([[ 5,  0,  5,  0,  5,  0,  5,  0,  5,  0],
       [ 0,  6,  0,  6,  0,  6,  0,  6,  0,  6],
       [ 7,  0,  7,  0,  7,  0,  7,  0,  7,  0],
       [ 0,  8,  0,  8,  0,  8,  0,  8,  0,  8],
       [ 9,  0,  9,  0,  9,  0,  9,  0,  9,  0],
       [ 0, 10,  0, 10,  0, 10,  0, 10,  0, 10],
       [11,  0, 11,  0, 11,  0, 11,  0, 11,  0],
       [ 0, 12,  0, 12,  0, 12,  0, 12,  0, 12],
       [13,  0, 13,  0, 13,  0, 13,  0, 13,  0],
       [ 0, 14,  0, 14,  0, 14,  0, 14,  0, 14]])

推荐阅读