【问题标题】:Modifying/Overwriting NumPy Array修改/覆盖 NumPy 数组
【发布时间】:2016-10-27 13:02:38
【问题描述】:

我有一系列二进制 NumPy 数组(在给定时间代表多云 (1s) 和晴朗 (0s) 的天空像素)并将它们加在一起以找到每个像素中存在云的观测总数。

我现在想找出云的百分比(云的数量(1s)/总观察值*100),但由于我想修改原始变量,因此无法使用 NumPy 数组在 Python 中使用它。

到目前为止,我的(简化的)代码是:

import numpy as np

arr1 = np.array([1,0,1])
arr2 = np.array([0,0,1])

total1 = np.add(arr1, arr2)
>>> [1 0 2]

total2 = total1                  #Purely to make multiple to elaborate my issue

variables = [total1, total2]

for x in variables:
     x = x + 100

total1
>>> [1 0 2]

基本上可以看到total1这个变量没有更新。它适用于以下情况:

for x in variables:
    x += 100

total1
>>> [201, 200, 202]

但是我不想将值增加 100,我想计算百分比,例如:

for x in variables:
    x = x / 1 * 100             #I have simplified the maths for ease of  reading

#This is my desired output - note how total1 is updated, not created
total1
>>> [100, 0, 200]

但这不起作用。我以这种方式访问​​变量,因为我有超过 2 个变量,并且正在尝试自动化我的代码以运行 n 个变量(变量名称来自 total1 > totaln)。

【问题讨论】:

  • 看看 numpy 及其数组。这是一个完美的用例。
  • 我不明白你的评论?我正在使用 NumPy 数组,但它不起作用?请详细说明?
  • 你能澄清你的代码吗?我认为问题在于当你想做一个深拷贝时你正在做一个浅拷贝。见docs.python.org/2/library/copy.html
  • 你能给出你想要的示例输出吗?
  • 你用什么格式输入系列?因为直接在输入上计算它可能更容易,如果你有 3D 的话。

标签: python arrays numpy


【解决方案1】:

以下代码将创建数组,将它们相加,然后将每个元素除以 100。对于百分比,您需要知道条目数。您可以使用 3-D 数组并使用 numpy 的求和/平均等函数。

import numpy as np
a = np.array([1,0,1])
b = np.array([0,0,1])
c = (a+b)/100

如果您可以将输入设置为 3d 堆栈图像(只是一个疯狂的猜测),您可以执行以下操作:

import numpy as np

a = np.array([[1,0,1],[0,0,0],[0,0,1]])
b = np.array([[0,0,0,],[0,1,0],[1,1,1]])
c = np.empty((2,3,3))
c[0]=a
c[1]=b

d = (c.sum(axis=0)/c.shape[0])*100

这当然可以根据输入变得更简单。我只是把它放在这里,以显示每个步骤。

【讨论】:

  • 谢谢-我知道这种方法,我只是想知道是否可以在不创建新变量'c'的情况下完成整个操作,在你的情况下,每次。您对这是否可能有任何想法?
  • 嗯,你需要以某种方式处理你的输出。如果你想就地做这些事情,不要把它命名为 c,而是 a :)
  • 感谢您的帮助 - 我了解您的示例,并且我知道将 'c' 替换为 'a' 会覆盖 'a' 中的值,但是当我这样做时,我描述的问题仍然存在我的问题中提到的“for x in variable”方法。 'x' 没有更新 - 我希望这是有道理的。
  • 嗯,这是范围的问题。您在 for 循环中分配 x 。我将添加另一个答案来解决这个问题。
【解决方案2】:

如果您只想添加就地工作:

for i in range(len(variables)):
  variables[i]+=100

应该可以解决问题。请注意,这样做是非常低效的。

【讨论】:

  • 再次感谢 Dschoni,但请阅读原始问题。我知道增量添加/减去更新变量(我在原始问题中对此进行了解释),但我想覆盖/更新原始变量以用百分比替换观察数。这不适用于 += 或 -=(或类似)方法。
  • 这会将 variables[i] 设置为您想要的任何值。你可以做 variables[i]=variables[i]*2+1 例如
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2012-04-26
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多