【问题标题】:How to modify Numpy array in for loop如何在 for 循环中修改 Numpy 数组
【发布时间】:2019-08-07 01:59:19
【问题描述】:

我有一个 1 和 0 的 Pandas 数据框转换为一个数组: [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

我正在使用以下函数来修改数组:

def regressor(x, param):
    new_array = x
    for i in range(len(new_array)):

        length = len(new_array)
        current = new_array[(length-i)-1]
        previous = new_array[(length-i)-2]

        if current != 0:
            if previous == 0:
                new_array[(length-i)-2] = current*param

    return new_array

但是,我的数组仍然没有改变。 new_array[(length-i)-2] 似乎并没有真正修改数组的那个元素。

谁能告诉我我错过了什么? 谢谢

更新:我的问题通过将 DataFrame 转换为 pandas.Series 然后将其转换为函数内的列表来解决。

【问题讨论】:

  • 也许你的“参数”是0?我已经测试了你的代码,列表确实改变了参数!= 0。如果你在函数内打印(new_array)你可以看到。或者你在函数之外做错了什么
  • 不,它适用于普通的 python 数组,但在使用 Numpy 数组时保持不变
  • 你必须向我们展示调用函数的代码。什么是numpy数组?是 x 吗?为什么需要 new_array = x?在函数内部没有任何问题,可能问题出在你调用它的位置。
  • new_array = regressor(current_array, 0.9) 为了我自己的可读性,我只是在函数中将它命名为 new_array
  • 这确实没有什么问题。如果你做 new_array = regressor(current_array, 0.9) 和 print(new_array) 它会给你改变的数组,不管它是否是 numpy.array 。你是如何定义变量 new_array 和 current_array 的?

标签: python arrays list numpy numpy-ndarray


【解决方案1】:

如果我运行你的代码,我会得到这个(对于 param=2):

x = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

def regressor(x, param):
    new_array = x
    for i in range(len(new_array)):

        length = len(new_array)
        current = new_array[(length-i)-1]
        previous = new_array[(length-i)-2]

        if current != 0:
            if previous == 0:
                new_array[(length-i)-2] = current * param

    return new_array

new_array = regressor(x, 2)
print(new_array)
# Output:
# [8, 4, 2, 1, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1]

为什么您的new_array 没有变化?你真的调用回归函数来更新你的数组吗? 此外,在函数开头将x 复制到new_array 是多余的。

只需重新发布您的函数并进行一些编辑以提高可读性:

def regressor(arr, param):
    for i in range(len(arr)):

        length = len(arr)
        current = arr[(length-i)-1]
        previous = arr[(length-i)-2]

        if (current != 0) and (previous == 0):
                arr[(length-i)-2] = current * param

    return arr

【讨论】:

  • 是的,这适用于列表或普通 python 数组,但使用 Numpy 数组时不会改变
  • numpy 数组也一样:对于x = np.array([0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]),它返回array([ 8, 4, 2, 1, 2097152, 1048576, 524288, 262144, 131072, 65536, 32768, 16384, 8192, 4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1])
  • 我想知道开头的xnew_array 的副本是否是尝试保留输入数组x 而不是原地修改它的失败尝试。否则你甚至不需要退货。我几乎打赌@Ferrari_M 说数组没有改变,因为new_arr == x ... 这是真的,因为它们是被修改的同一个对象。
  • 我首先将 Pandas 数据帧转换为 Numpy 数组,然后将函数应用于它。数组原样返回。如果我创建一个常规数组并应用该函数,它工作正常。这可能是 DataFrame 转换问题吗?
  • 更新:我的问题通过将 DataFrame 转换为 pandas.Series 然后将其转换为函数内的列表来解决。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 2019-09-11
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多