簡體   English   中英

如何將兩種不同類型的數據(字符串和整數)添加到numpy ndarray中

[英]How can I add two different type of data, string and int, into numpy ndarray

我用pandas.read_csv讀取一個excel文件,我的文件中有兩列,一列是字符串類型,另一列是整數。

data = pandas.read_csv('data.csv')

然后,我為這些numpy ndarray打印了這些數據類型。

print(type(data.get_values()[0, 0]))
print(type(data.get_values()[0, 1]))

結果:

<class 'str'>
<class 'int'>

它告訴我,有一種方法可以在相同的numpy ndarray中添加兩種不同的數據類型。

但是,當我想在同一個numpy ndarrays中添加兩種不同數據類型的數據時:

arr = numpy.ndarray((1, 2))
arr[0][0] = 1
arr[0][1] = 'str'

控制台向我顯示了以下信息:

ValueError: could not convert string to float: 'str'

有人能告訴我該怎么做嗎?

您可以為每個字段創建具有任意C樣式數據類型的numpy ndarray 訣竅是先為數組創建數據類型 ,然后將其設置為數組的dtype 唯一令人討厭的事情是,由於它們是C樣式類型,因此必須顯式定義這些類型,並且如果您有字符串,則包括設置每個字段可以包含的字符數。

例如:

>>> import numpy as np
>>> person_dt = np.dtype([('Name', 'S25'), ('Age', np.uint8)])
>>> person_dt
dtype([('Name', 'S25'), ('Age', 'u1')])
>>> persons = np.array([('alice', 35), ('bob', 39)], dtype=person_dt)
>>> persons
array([(b'alice', 35), (b'bob', 39)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])

在這里,我正在創建一個numpy dtype 數組的每個單獨部分都是一個field ,我正在為這些字段的名稱分配NameAge ,並為每個字段分配類型。 因此,“ Name字段是一個包含25個字符或更少字符的字符串(這是\\0終止的字符串,就像在C語言中一樣),並且年齡是一個無符號整數,因為我們的年齡當然會小於255。請注意前面的b該字符串僅表示類型是byte-string

然后,我只需使用新的dtype創建數組並傳遞值。

最酷的是,您可以通過它們所屬的字段來獲取值。 例如,您可以通過獲取“ Age字段來獲取所有Age ,並且它將具有我將年齡分配給的類型:

>>> persons['Age']
array([35, 39], dtype=uint8)

因此,您可以進一步深入這些結果數組:

>>> persons['Name'][1]
b'bob'

而且您仍然可以像通常那樣創建和分配:

>>> new_persons = np.zeros(5, dtype=person_dt)
>>> new_persons
array([(b'', 0), (b'', 0), (b'', 0), (b'', 0), (b'', 0)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])
>>> new_persons[0] = ('alice', 25)
>>> new_persons[1] = ('bob', 26)
>>> new_persons['Name'][2:5]
array([b'', b'', b''],
      dtype='|S25')
>>> new_persons['Name'][2:5] = 'carol', 'david', 'eve'
>>> new_persons['Age'][2:5] = 27, 28, 29
>>> new_persons
array([(b'alice', 25), (b'bob', 26), (b'carol', 27), (b'david', 28), (b'eve', 29)],
      dtype=[('Name', 'S25'), ('Age', 'u1')])

我前不久參加了一次有關創建和管理numpy dtypes ,這很棒。 演講的Jupyter筆記本在線,您可以在這里訪問 ,它可能會更進一步說明您使用它們的所有不同方式。

暫無
暫無

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

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