讓我們看看我能解釋這是怎麼回事
In [32]: ll=['one','two','three']
In [33]: a1=np.array(ll,dtype=object)
In [34]: a1
Out[34]: array(['one', 'two', 'three'], dtype=object)
In [35]: a1[1]='eleven'
In [36]: a1
Out[36]: array(['one', 'eleven', 'three'], dtype=object)
a1
就像ll
由指針 - 指向駐留在內存中其他位置的字符串的指針。我可以改變任何這些指針,就像我可以在列表中一樣。在大多數方面a1
的行爲就像一個列表 - 除了它可以重塑,並做一些其他基本的事情。
In [37]: a1.reshape(3,1)
Out[37]:
array([['one'],
['eleven'],
['three']], dtype=object)
但是,如果我做一個string
陣列
In [38]: a2=np.array(ll)
In [39]: a2
Out[39]:
array(['one', 'two', 'three'],
dtype='<U5')
In [42]: a1.itemsize
Out[42]: 4
In [43]: a2.itemsize
Out[43]: 20
的值存儲在陣列的數據緩衝。這裏它創建了一個數組,每個元素有5個Unicode字符(Python3)(每個字符5 * 4字節)。
現在,如果我取代的a2
的元素,我可以得到截斷
In [44]: a2[1]='eleven'
In [45]: a2
Out[45]:
array(['one', 'eleve', 'three'],
dtype='<U5')
,因爲只有5個新值超出所分配的空間的字符。
所以有一個折衷 - 訪問速度更快,因爲字節存儲在固定的已知大小的數組中,但不能存儲更大的東西。
你可以每個元素分配更多的空間:
In [46]: a3=np.array(ll,dtype='|U10')
In [47]: a3
Out[47]:
array(['one', 'two', 'three'],
dtype='<U10')
In [48]: a3[1]='eleven'
In [49]: a3
Out[49]:
array(['one', 'eleven', 'three'],
dtype='<U10')
genfromtxt
是一個用於創建與字符串數組dtypes的常用工具。在設置字符串長度之前(至少在使用dtype=None
時),它會等待它讀取所有文件。字符串字段通常是多字段結構化數組的一部分。字符串字段通常是標籤或ID,而不是您經常更改的內容。
我可以想象寫一個函數,可以檢查字符串長度對dtype和提出一個錯誤,如果截斷會發生。但是這會減緩行動。
def foo(A, i, astr):
if A.itemsize/4<len(astr):
raise ValueError('too long str')
A[i] = astr
In [69]: foo(a2,1,'four')
In [70]: a2
Out[70]:
array(['one', 'four', 'three'],
dtype='<U5')
In [72]: foo(a2,1,'eleven')
...
ValueError: too long str
但它值得額外的工作?
*」 ......在截斷的情況下,產生異常?「*如果設置某個標誌啓用了這種行爲,這可能會很好,可能類似於'numpy.seterr()'控制浮點錯誤的處理方式。我從來沒有見過這樣的旗幟,但作爲一個增強的numpy請求,我會給它一個+1。 –
@WarrenWeckesser。我同意,它也可能是一個警告或類似的東西。 –