Saya是一個形狀為(N,)和的 numpy 陣列b = a[k:l]。我知道x = b[i],有沒有辦法找到j這樣x = a[j]不知道k,并l和沒有搜索a的x?
例如a = np.array([2,4,3,1,7])和b = a[1:4]。我只能訪問b,但想知道 的索引3是什么a,知道它的索引b是1.
當然,我可以a通過 using訪問b.base,然后搜索aitem 3,但我想知道是否有附加到視圖的方法可以回傳基本陣列中專案的索引。
uj5u.com熱心網友回復:
正如@hpaulj 已經在評論中指出的那樣,沒有內置功能可以這樣做。但是您仍然可以根據基dtype址和視圖之間的大小和位元組偏移量計算基址的索引。您可以從屬性中獲取位元組偏移量ndarray.__array_interface__['data'][0]
import numpy as np
import unittest
def baseIndex(array: np.ndarray, index: int) -> int:
base = array.base
if base is None:
return index
size = array.dtype.itemsize
stride = array.strides[0] // size
offset = (array.__array_interface__['data'][0] - base.__array_interface__['data'][0]) // size
return offset index * stride
a = np.array([0,1,2,3,4,5,6])
b = a
class Test(unittest.TestCase):
def test_1_simple(self):
"""b = a"""
b = a
i = 1
j = baseIndex(b, i)
self.assertEqual(a[j], b[i])
def test_2_offset(self):
"""b = a[3:]"""
b = a[3:]
i = 1
j = baseIndex(b, i)
self.assertEqual(a[j], b[i])
def test_3_strided(self):
"""b = a[1::2]"""
b = a[1::2]
i = 1
j = baseIndex(b, i)
self.assertEqual(a[j], b[i])
def test_4_reverse_strided(self):
"""b = a[4::-2]"""
b = a[4::-2]
i = 1
j = baseIndex(b, i)
self.assertEqual(a[j], b[i])
unittest.main(verbosity=2)
輸出:
test_1_simple (__main__.Test)
b = a ... ok
test_2_offset (__main__.Test)
b = a[3:] ... ok
test_3_strided (__main__.Test)
b = a[1::2] ... ok
test_4_reverse_strided (__main__.Test)
b = a[4::-2] ... ok
----------------------------------------------------------------------
Ran 4 tests in 0.001s
OK
編輯:我現在更新了函式來處理b不連續和/或反向的情況,感謝@Jér?me Richard 發現這一點。此外,正如@mozway 所說,ndarray.__array_interface__是一個內部 numpy 細節,可以在不通知的情況下更改,但截至目前,我看不到任何其他方法可以這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400528.html
上一篇:3維矩陣的單位矩陣
