在下面的示例中,我想将一组特定的行修改为一个组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.]]
在NumPy中,"basic slices",例如
x[2, :]
,返回视图。你知道吗所谓的"advanced indexing", 例如
x[(0,1,3), :]
,返回数组的副本。你知道吗在引擎盖下,NumPy数组将值存储在一个连续的内存块中 访问基于
dtype
、shape
和strides
的值。价值观 它们本身在该内存块中可能是不连续的,这取决于步长,但是每个数组引用单个内存块中的值。你知道吗高级索引允许您从此内存块中选择任意行。 通常,无法使用原始数组指定结果数组 记忆块,只是一个数据类型,形状和步幅。因此,结果数组的值必须是 复制到新数组中。这就是为什么高级索引总是返回一个副本。你知道吗
修改数组的副本(正如人们所期望的那样)不会影响原始数组。这就是为什么将
x[(0, 1, 3), :]
传递给inplace_place
不会影响x
。你知道吗但是,即使左侧使用高级索引,指定也会影响原始数组。例如
会影响
x
。因此,您可以通过将行传递到inplace_process
并在那里对a[rows, :]
执行赋值来修复代码:相关问题 更多 >
编程相关推荐