簡體   English   中英

使用包含數字的字符串進行索引時,2D numpy數組不會出錯

[英]2D numpy array does not give an error when indexing with strings containing digits

當我在numpy中創建一維數組並使用一個字符串(包含數字)來索引它時,我得到了一個錯誤:

>>> import numpy as np
>>> a = np.arange(15)
>>> a['10']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: field named 10 not found.

但是,當我創建一個二維數組並使用兩個字符串進行索引時,它不會給出錯誤並返回該元素,就像首先將字符串轉換為整數一樣

>>> b = np.arange(15).reshape(3,5)
>>> b
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> b[1, 2]
7
>>> b['1', '2']
7

這是怎么回事? 為什么我在二維情況下沒有出錯?

免責聲明 - 這個答案肯定是不完整的

我認為你所看到的是花式序列索引的結果 因為字符串實際上是序列,所以你一次得到一個字符串的值並將它們轉換為“ intp ”對象(可能只是使用python的int函數) - 然后它會給你數組索引。

這也解釋了1D案例:

class Foo(object):
    def __getitem__(self,idx):
        print idx

a = Foo()
a[12]
a[12,12]

注意,在第二種情況下傳遞tuple ,而在第一種情況下傳遞整數。


這個測試證明了我仍然不理解的部分:

import numpy as np
a = np.arange(156).reshape(13,12)
print a[12,3] == a['12',3]   #True -- I would have thought False for this one...
print a['12',3] == a[('1','2'),3]  #False -- I would have guessed True for this..
assert( a[tuple('12'),3] == a[(1,2),3] )  #This passes, as expected

請在評論中嘗試向我解釋這個。 :)差異可能是numpy在轉換為一系列intp對象時故意留下字符串,以便更順暢地處理記錄數組...

只是要添加,請注意第一種情況(單個字符串),可能與支持重新排列有關,它使用字符串作為字段名稱。

不要依賴於第二種情況。 Numpy非常自由地使用非數組進行索引,因為如果它是非數組(而不是切片而不是None),它將只是嘗試將其轉換為整數數組,這是為這些字符串定義的。 然而,這不是設計,因為太多的軟件依賴於這種行為(至少部分地)來實際改變它,而且老實說,雖然這對於忘記投射的浮動有些有意義,但它確實沒有對於字符串。


@mgilson的更多細節。 考慮到所有這些都是標簽使用,它真的很適合實現細節。 例如,單個字符串當前特別用於重新排列,即使它不是重新排列,但字符串元組只是特殊的重新排列。

現在一個字符串列表,有些特殊,因為它們不是元組,但大部分時間都像一個。 這可能是一個小錯誤...因為它在其中找到一個序列,它會觸發花哨的索引,但“忘記”將其轉換為數組。 雖然我通常會使用元組來表示多個軸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM