【问题标题】:Python - best way to set a column in a 2d array to a specific valuePython - 将二维数组中的列设置为特定值的最佳方法
【发布时间】:2010-02-05 12:56:32
【问题描述】:

我有一个二维数组,我想将一列设置为特定值,我的代码如下。这是python中最好的方法吗?

rows = 5
cols = 10

data = (rows * cols) *[0]
val = 10
set_col = 5

for row in range(rows):
    data[row * cols + set_col - 1] = val

如果我想将多个列设置为特定值,我该如何扩展它

我只想使用python标准库

谢谢

【问题讨论】:

  • 我知道你只想要标准库,但 numpy 就是为此而生的。

标签: python multidimensional-array


【解决方案1】:

NumPy 包提供了强大的 N 维数组对象。如果datanumpy 数组,则将set_col 列设置为val 值:

data[:, set_col] = val

完整示例:

>>> import numpy as np
>>> a = np.arange(10)
>>> a.shape = (5,2)
>>> a
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> a[:,1] = -1
>>> a
array([[ 0, -1],
       [ 2, -1],
       [ 4, -1],
       [ 6, -1],
       [ 8, -1]])

【讨论】:

  • 我将我的答案保留在标准库的范围内,但我不得不说这是对数组的任何重要用途的正确方法。
  • 特别是,您可以轻松地进行多列分配。例如,a[:,[0,2]] += [3,5]
【解决方案2】:

更好的解决方案是:

data = [[0] * cols for i in range(rows)]

对于cols = 2rows = 3 的值,我们会得到:

data = [[0, 0],
        [0, 0],
        [0, 0]]

然后你可以访问它:

v = data[row][col]

这会导致:

val = 10
set_col = 5

for row in range(rows):
    data[row][set_col] = val

或者更 Pythonic(感谢 J.F. Sebastian):

for row in data:
    row[set_col] = val

【讨论】:

  • 无需使用显式行索引:for row in data: \n row[col_index] = value
【解决方案3】:

您使用的方式本身并没有什么问题,只是将变量命名为set_col 比命名为set_row 更清晰,因为您正在设置列。

所以设置一些列,用另一个循环包裹它:

for set_col in [...columns that have to be set...]

但有一个问题:您的 2D 数组不寻常,因为它被打包在一个 1D 数组中(Python 也可以通过列表列表支持 2D 数组),所以我会用方法或函数来包装它。

【讨论】:

    【解决方案4】:

    在您的情况下,行和列可能是可互换的,即哪个是哪个语义问题。如果是这种情况,那么您可以让列占据data 列表中的单元格序列,然后使用以下方法将它们归零:

      data[column_start:column_start+rows] = rows * [0]
    

    【讨论】:

      【解决方案5】:

      较早的答案遗漏了range,因此您可以尝试以下操作:

      cols = 7
      rows = 8
      
      data = [[0] * cols for i in range(rows)]
      
      val = 10
      set_col = 5
      
      for row in data:
          row[set_col] = val
      

      要将其扩展到多个列,您可以将列号及其值存储在dict 中。因此将第 5 列设置为 10,将第 2 列设置为 7:

      cols = 7
      rows = 8
      
      data = [[0] * cols for i in range(rows)]
      
      valdict = {5:10, 2:7}
      
      for col, val in valdict.items():
          for row in data:
              row[col] = val
      

      按照另一个答案中的建议交换行和列,这会稍微简单一些:

      cols = 7
      rows = 8
      
      data = [[0] * rows for i in range(cols)]
      
      valdict = {5:10, 2:7}
      
      for col, val in valdict.items():
          data[col] = [val] * rows
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 2021-06-16
        • 2020-01-29
        • 1970-01-01
        • 2021-08-08
        相关资源
        最近更新 更多