修改/覆盖NumPy数组

3
我有一系列NumPy二进制数组(表示给定时间内的多云(1s)和晴朗(0s)天空像素),我已将它们相加以找到每个像素中存在云的总观测次数。
现在我想找出云的百分比(云数量(1s)/总观测次数*100),但是在Python中使用NumPy数组时,我无法修改原始变量。
迄今为止,我的(简化后的)代码如下:
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和它的数组。这是一个完美的使用案例。 - Dschoni
我不明白你的评论?我正在使用NumPy数组,但它没有起作用?请详细说明一下? - tda
你能给出你的例子所期望的输出吗? - Dschoni
Well和x/=(1*100)同样有效。 - Dschoni
感谢您一直以来的帮助!您能进一步解释为什么这不是理想的吗?我对Python还比较新,可能会忽略一些简单的东西。这是因为这种方法效率低下吗? - tda
显示剩余6条评论
3个回答

0
以下代码将创建数组,将它们相加并将每个元素除以100。对于百分比,您需要了解输入数量。您可以使用3D数组和numpy的sum/average等函数来处理它们。
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'来完成整个过程。你有任何想法吗? - tda
好的,你需要以某种方式处理你的输出。如果你想在原地进行操作,只需将其命名为a而不是c :) - Dschoni
谢谢您的帮助 - 我理解了您的例子,并知道用'a'替换'c'会覆盖'a'中的值,但当我使用在我的问题中提到的“for x in variable”方法时,我描述的问题仍然存在。'x'未更新 - 希望这样说清楚了。 - tda
嗯,这是一个范围的问题。你在for循环中赋值了x。我会添加另一个答案来解决这个问题。 - Dschoni

0
如果您只想让添加在原地进行:
for i in range(len(variables)):
  variables[i]+=100

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


再次感谢Dschoni,但请阅读原始问题。我知道增量添加/减少以更新变量(我已在原始问题中解释过),但我想要覆盖/更新原始变量,以用百分比替换观测数量。使用+=或-=(或类似方法)无法实现此目的。 - tda
这将变量[i]设置为您想要的任何值。您可以执行variables[i]=variables[i]*2+1,例如。 - Dschoni

0

可以通过使用空索引来访问变量下面的数组数据来完成此操作,如下所示:

a = np.arange(5)
b = np.arange(5)*2

vars = [a, b]
for x in vars:
    x[:] = x + 100
a
>>> array([100, 101, 102, 103, 104])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接