我想创建一个矩阵C,其中每个元素等于其对应的行和列索引的最小值。例如:对应第一行和第二列的元素的值应为1,对应第八行的元素和第三列的值应为3,等等。
我写了下面的代码,告诉我我想要的东西。运行以下代码:
from numpy import empty
C = empty(shape=(32,32))
for j in range(1,33):
for i in range(1,33):
minimum = min(i,j)
C[i-1][j-1] = minimum
print(C)
结果
[[ 1. 1. 1. ..., 1. 1. 1.]
[ 1. 2. 2. ..., 2. 2. 2.]
[ 1. 2. 3. ..., 3. 3. 3.]
...,
[ 1. 2. 3. ..., 30. 30. 30.]
[ 1. 2. 3. ..., 30. 31. 31.]
[ 1. 2. 3. ..., 30. 31. 32.]]
问题:这是最有效的方式吗?如果不;如何改进这种方法?
答案 0 :(得分:0)
选项1
np.mgrid
np.mgrid[1:33, 1:33].min(axis=0)
array([[ 1, 1, 1, ..., 1, 1, 1],
[ 1, 2, 2, ..., 2, 2, 2],
[ 1, 2, 3, ..., 3, 3, 3],
...,
[ 1, 2, 3, ..., 30, 30, 30],
[ 1, 2, 3, ..., 30, 31, 31],
[ 1, 2, 3, ..., 30, 31, 32]])
选项2
np.indices
(np.indices((32, 32)) + 1).min(axis=0)
array([[ 1, 1, 1, ..., 1, 1, 1],
[ 1, 2, 2, ..., 2, 2, 2],
[ 1, 2, 3, ..., 3, 3, 3],
...,
[ 1, 2, 3, ..., 30, 30, 30],
[ 1, 2, 3, ..., 30, 31, 31],
[ 1, 2, 3, ..., 30, 31, 32]])
答案 1 :(得分:0)
另一种方法是执行包含每列所有1的上三角矩阵的累积和:
In [16]: np.cumsum(np.triu(np.ones((32,32))), axis=0)
Out[16]:
array([[ 1., 1., 1., ..., 1., 1., 1.],
[ 1., 2., 2., ..., 2., 2., 2.],
[ 1., 2., 3., ..., 3., 3., 3.],
...,
[ 1., 2., 3., ..., 30., 30., 30.],
[ 1., 2., 3., ..., 30., 31., 31.],
[ 1., 2., 3., ..., 30., 31., 32.]])
显然不如mgrid
方法有效,但我认为这是一种奇特的选择。