如何在numpy数组的特定行中进行原地处理

2024-04-26 13:21:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的示例中,我想将一组特定的行修改为一个组in-place。对inplace\u进程的第一次调用似乎会导致传递数组的副本,而对inplace\u进程的第二次调用则直接修改x变量。你知道吗

在我的实际用例中,数组的大小太大,无法创建一个副本,我正在调用项目外部的代码。你知道吗

import numpy as np

def inplace_process(a, C, N):
    a.shape = (C, N)
    a[:, :] = float(C*N)

C = 4
N = 128
x = np.zeros((C, N))

# process a specific set of rows
inplace_process(x[(0, 1, 3), :], 3, N)
# independently process an inner row
inplace_process(x[2, :], 1, N)

print '-----------------------------------------------------'
print ' We want C*N and not zeros'
print x

输出:

[[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.]
 [ 128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.  128.
   128.  128.  128.  128.  128.  128.  128.  128.]
 [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.    0.
     0.    0.    0.    0.    0.    0.    0.    0.]]

Tags: 项目代码inimport示例进程np副本
1条回答
网友
1楼 · 发布于 2024-04-26 13:21:38

在NumPy中,"basic slices",例如x[2, :],返回视图。你知道吗

所谓的"advanced indexing", 例如x[(0,1,3), :],返回数组的副本。你知道吗

在引擎盖下,NumPy数组将值存储在一个连续的内存块中 访问基于dtypeshapestrides的值。价值观 它们本身在该内存块中可能是不连续的,这取决于步长,但是每个数组引用单个内存块中的值。你知道吗

高级索引允许您从此内存块中选择任意行。 通常,无法使用原始数组指定结果数组 记忆块,只是一个数据类型,形状和步幅。因此,结果数组的值必须是 复制到新数组中。这就是为什么高级索引总是返回一个副本。你知道吗

修改数组的副本(正如人们所期望的那样)不会影响原始数组。这就是为什么将x[(0, 1, 3), :]传递给inplace_place不会影响x。你知道吗

但是,即使左侧使用高级索引,指定也会影响原始数组。例如

x[(0, 1, 3), :] = C*N

会影响x。因此,您可以通过将行传递到inplace_process并在那里对a[rows, :]执行赋值来修复代码:

import numpy as np

def inplace_process(a, rows, C, N):
    a[rows, :] = float(C*N)

C = 4
N = 128
x = np.zeros((C, N))

# process a specific set of rows
inplace_process(x, (0, 1, 3), 3, N)
# independently process an inner row
inplace_process(x, [2], 1, N)

相关问题 更多 >