簡體   English   中英

如何添加一個numpy數組的兩列?

[英]How to add two columns of a numpy array?

我有兩個具有相同行數的NumPy數組,但是我想添加特定的列。

我嘗試了以下方法:

src_array[:, 3] += column_array_to_add[:, 0]

但是,這甚至不能解釋。 NumPy執行此操作的正確方法是什么? 我希望能夠同時使用整數和字符串。

編輯:一個簡短的,自包含的測試腳本

import numpy
src = numpy.array([["a", "b"], ["c", "d"], ["e", "f"]])
src2 = numpy.array([["x"], ["y"], ["z"]])

src[:, 1] += src2[:, 0]
print src
exit()

該腳本返回以下錯誤:

src[:, 1] += src2[:, 0]
TypeError: unsupported operand type(s) for +=: 'numpy.ndarray' and 'numpy.ndarray'

這樣的事情行嗎?

import numpy as np

x = np.array([[1,2],[3,4]])

y = np.array([[5,6],[7,8]])

結果

>>> x
array([[1, 2],
       [3, 4]])
>>> y
array([[5, 6],
       [7, 8]])
>>> x[:,1] + y[:,1]
array([ 8, 12])
>>> x[:, 1] += y[:, 1] # using +=
>>> x[:, 1]
array([ 8, 12])

更新:

我認為這應該為您工作:

src = np.array([["a", "b"], ["c", "d"], ["e", "f"]], dtype='|S8')
src2 = np.array([["x"], ["y"], ["z"]], dtype='|S8')

def add_columns(x, y):
    return [a + b for a,b in zip(x, y)]

def update_array(source_array, col_num, add_col):
    temp_col = add_columns(source_array[:, col_num], add_col)
    source_array[:, col_num] = temp_col  
    return source_array

結果:

>>> update_array(src, 1, src2[:,0])
array([['a', 'bx'],
       ['c', 'dy'],
       ['e', 'fz']], 
      dtype='|S8')

當您需要調試這種事情時,將其分解為更簡單的步驟很有用。 您是否弄錯了切片,添加了兩種不兼容的數組類型,添加了兩種類型,但是試圖將結果粘貼為不兼容的類型(當+可以,但=否時使用+= ),或者添加了不兼容的數據值? 其中任何一個都可能引發TypeError ,那么我們如何知道您在做什么呢?

好吧,一次做一次,看看:

切片:

>>> src[:, 1]
array(['b', 'd', 'f'], dtype='|S1')
>>> src[:, 1] = ['x', 'y', 'z']
>>> src
>>> array([['a', 'x'], ['c', 'y'], ['e', 'z']], dtype='|S1')

沒關系。 怎么添加呢?

>>> src + src2
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray'

因此,我們已經找到了與更復雜的情況相同的錯誤,沒有切片,也沒有+= ,這使得調試起來容易得多。 讓我們變得更簡單:

>>> s1, s2 = np.array('a'), np.array('b')
>>> s1 + s2
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray'

因此,即使添加兩個0D數組也會失敗! 沒有比這更簡單的了。

也許是數據類型。 如果我們使用整數會怎樣?

>>> n1, n2 = np.array(1), np.array(2)
>>> n1 + n2
3

您可以使用整數代替字符串來回到原始示例,並且仍然可以正常工作:

>>> m1 = np.array([[1,2], [3,4], [5,6]])
>>> m2 = np.array([[7], [8], [9]])
>>> m1[:, 1] += m2[:, 0]
>>> array([[ 1,  9],
           [ 3, 12],
           [ 5, 15]])

這應該清楚表明問題出在數據類型上。 那么,什么數據類型? 只需打印出數組,看看numpy認為是什么:

>>> src = numpy.array([["a", "b"], ["c", "d"], ["e", "f"]])
>>> src
array([['a', 'b'], ['c', 'd'], ['e', 'f']], dtype='|S1')

'|S1'是不是你在用戶指南部分看到友好的數據類型中的一種數據類型 ,它是一個結構的定義,如在上一節中介紹結構化陣列 它的意思是一個1個字符的固定長度字符串。

這使問題變得顯而易見:您不能添加兩個1個字符的定長字符串,因為結果不是1個字符的定長字符串。

如果您真的想按原樣進行此工作,則簡單的解決方案是將其保留為Python字符串:

>>> src = numpy.array([["a", "b"], ["c", "d"], ["e", "f"]], dtype=object)
>>> src2 = numpy.array([["x"], ["y"], ["z"]], dtype=object)    
>>> src[:, 1] += src2[:, 0]

沒有更多的TypeError

另外,如果您顯式地給src一個|S2的dtype, numpy將允許它,而第二個字符將只是空白。 它不會讓您添加另一個|S1 ,但是您可以在Python中循環,或者找到一種復雜的方法來修復numpy為您完成它。 無論哪種方式,您當然都沒有獲得numpy的任何通常的時間性能優勢,但是仍然獲得了使用壓縮固定大小單元的空間性能優勢。

但是您可能想退后一步,在這里詢問您要擺脫numpy 您在這里實際的更高目標是什么? numpy大多數好處來自使用numpy知道如何使用的嚴格C / Fortran風格的數據類型-它可以將它們緊密包裝,訪問它們而無需額外的取消引用(且無需重新計數),以各種方式進行操作在沒有Python等任何幫助的情況下,復制到復制到打印。但是它不能進行字符串操作。 如果要向量化字符串操作,則使用錯誤的庫。 如果您只是因為有人說它很快速而使用numpy ,那么在很多情況下都是這樣,但在這種情況下不是。 如果您使用numpy是因為其他一些代碼正在處理numpy數據,但是您不想以numpy方式處理它,那么沒有什么阻止您將其轉換為純Python數據。

暫無
暫無

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

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