簡體   English   中英

如果條目本身是結構化數組,如何將numpy數組中的條目設置為0或無?

[英]How do you set an entry in a numpy array to 0 or None if the entries are structured arrays themselves?

我有一個結構化數組的對象列表,例如:

a = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
b = np.array([('Dog3', 9, 81.0), ('Dog4', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])
c = np.array([('Dog5', 9, 81.0), ('Dog6', 3, 27.0)], dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])

lst = [a, b, c]

現在我需要此列表本身是一個numpy數組,因為我需要在其上使用numpy.where() ,否則它將無法正常工作。

lst = np.array(lst)

所以我要做這樣的事情:

ID = np.where(lst == c)
lst[ID] = 0 or rather lst[ID] = None

但是,而不是我想要得到的,即

>>>lst
array([a, b, 0/None], dtype=...)

我要么得到這個:

>>>lst
array([a, b, [('0', 0,  0.), ('0', 0,  0.)]], dtype=...)

或根本不起作用:

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

我該如何完成? 我是否必須將lst轉換回列表拳頭?

讓我們做一個更簡單的數組,並嘗試設置一些值:

In [14]: dt = np.dtype([('foo','U10'),('bar',int)])                             
In [16]: arr = np.zeros(3, dtype=dt)                                            
In [17]: arr                                                                    
Out[17]: array([('', 0), ('', 0), ('', 0)], dtype=[('foo', '<U10'), ('bar', '<i8')])
In [18]: arr[1]                                                                 
Out[18]: ('', 0)
In [19]: arr[1] = 12                                                            
In [20]: arr                                                                    
Out[20]: 
array([('',  0), ('12', 12), ('',  0)],
      dtype=[('foo', '<U10'), ('bar', '<i8')])  

注意字符串'12'和整數12的混合。

用元組設置,每個字段一個值:

In [21]: arr[2] = ('dog',23)                                                    

設置為None失敗,因為它不能按照第二個字段的要求將None轉換為整數。

In [22]: arr[0] = None                                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-2f7a4c897706> in <module>
----> 1 arr[0] = None

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
In [23]: arr                                                                    
Out[23]: 
array([('None',  0), ('12', 12), ('dog', 23)],
      dtype=[('foo', '<U10'), ('bar', '<i8')])

實際上,它確實設法設置了字符串字段。

arr是一個數組,其中每個元素必須具有相同的dtype

帶有object dtype的數組的行為更像一個列表。 盡管偶爾有用,但它不應代替列表。

暫無
暫無

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

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