[英]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.