繁体   English   中英

使用 integer 或 boolean 索引获取 numpy 数组视图

[英]Getting a numpy array view with integer or boolean indexing

numpy arrays 可以使用 integer 或 Z84E2C64F38F78BA3EA5C905AB5A2DA27 进行部分分配,例如:

import numpy as np
x = np.arange(5)
x[[2,4]]=0
x
## array([0., 0., 1., 0., 1.])
x[[True]*2+[False]*3]=2
x
## array([2., 2., 1., 0., 1.])

然而,即使x[[2,4]]在这种情况下是左值,左值也不能分配给另一个变量,因为在这种情况下,分配是由__setitem__完成的,而__getitem__ ,当传递一个 integer 或 boolean 列表时,创建一个副本:

x = np.arange(5)
y = x[[2,4]]
y[:] = 1
x
array([0., 0., 0., 0., 0.])

问题:是否有任何简单/干净的方法来获得基于整数索引或布尔索引索引子集的可写数组视图? “简单/干净”是指我想避免编写新的 class,或者自己跟踪子指数。 基本上我正在寻找一些numpy function 或我无法谷歌的技巧。

这个问题的重点是能够递归地执行此操作,以便能够通过仅传递数组的视图而不是传递索引和基本数组来创建分配给数组片段的函数。

问题:是否有任何简单/干净的方法来获得基于整数索引或布尔索引索引子集的可写数组视图?

不。

NumPy arrays(和视图)需要具有恒定的步幅(即,memory 中的元素之间的距离必须是恒定的)。 如果您的索引操作会创建违反此限制的 object,那么您就不走运了。

有关相关问题的讨论,请参见此处

您不能在 numpy memory model 中。 numpy memory model 将数组定义为具有从一个元素跳转到下一个元素的常规步幅的东西。

一个很好的解释你的问题 在这里

您可以通过选择原始数组的切片或更改 dtype(或两者的组合)来创建视图。 创建切片视图的经验法则是,可以使用原始数组中的偏移量、步幅和计数来处理查看的元素。 (...)

花哨的索引不返回视图的原因是,一般来说,它不能表示为切片(在上述意义上,可以通过偏移量、步幅和计数来解决)。

例如,花式索引 for 可以表示为,但不可能通过切片来执行相同的操作。 因此,这就是为什么返回带有原始数据副本的 object 的原因。

所以作为一般规则,,你不能。

在我看来,使用视图最“笨拙”的方式是使用掩码,并跟踪这些掩码,而不是将视图分配给新变量。 我只是这样做:

m = [2, 4]
x[m] = some_function(x[m]) # whatever you need to do

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM