[英]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
,我正在為這些字段的名稱分配Name
和Age
,並為每個字段分配類型。 因此,“ 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.