如何在没有for循环的情况下在2D numpy数组中设置多个列?

时间:2014-09-06 00:35:07

标签: python for-loop numpy multidimensional-array indexing

我想设置numpy数组的值如下。但我不想使用for-loop。 有什么好办法吗?

a = range(4)
a[0] = [11,12,13,14,15,16]
a[1] = [21,22,23,24,25,26]
a[2] = [31,32,33,34,35,36]
a[3] = [41,42,43,44,45,46]

a = np.array(a)

changeIndex = [0,2,4]
for i in range(4):
    a[i][changeIndex] = 0

print a
#array([[ 0, 12,  0, 14,  0, 16],
#       [ 0, 22,  0, 24,  0, 26],
#       [ 0, 32,  0, 34,  0, 36],
#       [ 0, 42,  0, 44,  0, 46]])

2 个答案:

答案 0 :(得分:5)

您基本上想要访问多个列,您可以通过以下方式执行:

a[:, changeIndex] = 0

<强>记住:

  1. 第一个索引选择行,而第二个索引选择列。
  2. 您可以使用列表或元组选择多个索引。
  3. 更好的风格:

    另外,定义多维numpy数组或矩阵的更好方法是:

    a = np.array([range(11,17), range(21,27), range(31, 37), range(41,47)])
    

    感谢其中一条评论,您实际上可以使用np.arange()代替range()来加快计算速度

    <强>矩阵

    在处理2D阵列时,请考虑使用Matrix。当您对它们执行操作时,矩阵保持其多维特性,您还可以对它们使用特殊矩阵运算。阅读here。它们的工作方式也类似于数组:

    a = np.matrix([range(11,17), range(21,27), range(31, 37), range(41,47)])
    

    一个有点相关的帖子供你参考here

答案 1 :(得分:1)

我假设你不想使用'for'循环迭代所有行。有了numpy,你不必走这条路。

你可以使用

a[:, changeIndex] = 0

使用numpy时,changeIndex可以是整数(仅更改一列)或changeIndex可以是列表(允许您更改多列)。