簡體   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