python - 在循环中切片 NumPy 数组

标签 python arrays numpy

<分区>

我需要一个很好的解释(引用)来解释 (for) 循环内的 NumPy 切片。我有三个案例。

def example1(array):
    for row in array:
        row = row + 1
    return array

def example2(array):
    for row in array:
        row += 1
    return array

def example3(array):
    for row in array:
        row[:] = row + 1
    return array

一个简单的例子:

ex1 = np.arange(9).reshape(3, 3)
ex2 = ex1.copy()
ex3 = ex1.copy()

返回:

>>> example1(ex1)
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

>>> example2(ex2)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> example3(ex3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

可以看出第一个结果与第二个和第三个结果不同。

最佳答案

第一个例子:

您提取一行并将其加 1。然后您重新定义 指针 但不是数组 包含的内容!所以不会影响原来的数组。

第二个例子:

您进行就地操作 - 显然这会影响原始数组 - 只要它是一个数组。

如果你在做一个双循环,它就不会再工作了:

def example4(array):
    for row in array:
        for column in row:
            column += 1
    return array

example4(np.arange(9).reshape(3,3))
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

这不起作用,因为您不调用 np.ndarray__iadd__(修改数组指向的数据),而是调用 python int__iadd__。所以这个例子只适用于你的行是 numpy 数组。

第三个例子:

row[:] = row + 1 这被解释为类似于 row[0] = row[0]+1, row[1] = row[1]+1 , ... 同样,这会在原地工作,因此会影响原始数组。

底线

如果您正在对可变对象进行操作,例如 listnp.ndarray,您需要小心更改。这样的对象仅指向实际数据在内存中的存储位置 - 因此更改此指针(example1)不会影响保存的数据.您需要跟随指针(直接通过 [:] (example3) 或间接通过 array.__iadd__ (example2)) 更改保存的数据。

关于python - 在循环中切片 NumPy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36055830/

相关文章:

python - 试图确认平均汇集等于使用 numpy 丢弃高频傅里叶系数

pandas - 将系列添加到 DataFrame 时如何创建新的 NaN 列?

python - Django 2.0 试图用正则表达式获取主键但我得到 404

python - 如何将 Librosa 光谱图保存为特定大小的图像?

Java:如何清理数组并有效地以不同大小重用它?

ios - 如何将特定元素从数组传递到另一个 View 或函数? swift

python - 模拟 Lisp 的 :keywords in Python

python - 如何调整散点图的标记大小,使其与给定的半径相匹配? (使用 matplotlib 转换)

C++解构指针数组

python - 使用 NetworkX 计算 2 个节点之间的命中时间