【问题标题】:How to modify rows of 2D numpy arrays individually如何单独修改 2D numpy 数组的行
【发布时间】:2021-11-03 00:16:05
【问题描述】:

我有一个二维数组字典,我想按其平均值对每个二维数组的每一行进行归一化。

我有:

for key, value in sorted(baseline.items()): 
  for i in baseline[str(key)]:
    i = i / np.mean(i) 

地点:

  • baseline 是 dict
  • baseline[str(key)] 是一个 2D numpy 数组
  • i 是一维数组

print(i) 会产生适当更新的值,但 baseline.items() 中的各个行不会更新。

我错过了什么?

【问题讨论】:

    标签: python python-3.x numpy dictionary


    【解决方案1】:

    首先,这里有一个解决方案:

    for i in baseline.values():
        i /= i.mean(axis=1, keepdims=True)
    

    现在说说为什么。循环for i in baseline[key]: 在每次迭代时将一个视图绑定到二维数组的行中到名称i。您不需要str(key),因为外部循环确保密钥正确。事实上,避免不必要地转换键以避免意外,例如如果您不小心得到一个整数键。

    i = i / np.mean(i) 行 not 按其平均值对数组进行就地除法。它计算数组i / np.mean(i),然后将名称i 重新绑定到新数组。然后在下一次迭代中丢弃新数组。

    您可以通过重新分配到i 表示的切片来解决此问题:

    i[:] = i / np.mean(i)
    

    或者,您可以使用正确的运算符就地执行除法:

    i /= np.mean(i)
    

    正如您在我的解决方案中看到的那样,根本不需要遍历行。 np.mean 是一个向量化函数,可以沿数组的任何轴进行操作。通过设置keepdims=True,您可以确保在划分结果时,结果具有正确的形状,可以在原始数据上直接广播。

    针对 2D 数组的 i.mean(axis=1, keepdims=True) 的一个不太灵活的替代方案是

    i.mean(axis=1)[:, None]
    

    【讨论】:

    • 非常感谢!!!!解决方案和您的详细解释都非常有帮助!
    • @EricTeboul。您可以选择答案以从未回答队列中删除您的问题。这将为您提供足够的声誉,以通过投票表示赞赏。有关详细信息,请参见此处:stackoverflow.com/help/someone-answers。很高兴它成功了,欢迎来到 SO。
    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2020-11-05
    • 2012-06-08
    相关资源
    最近更新 更多