我正在用 Python 創建代碼,我需要對陣列執行一些操作。其中之一包括將陣列存盤在另一個陣列的特定位置。我試過這個:
import numpy as np
b = np.zeros([2, 2])
a = np.array([[0, 1], [1, 2]])
b[0, 0] = a
print(b)
但我收到以下錯誤:
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:/Users/Juan Vera/AppData/Roaming/JetBrains/PyCharmCE2021.2/scratches/scratch_11.py", line 6, in <module>
b[0, 0] = a
ValueError: setting an array element with a sequence.
我該如何解決這個錯誤?
uj5u.com熱心網友回復:
的默認資料型別np.zeros是np.float64。意思是,該陣列b期望其條目為64 位浮點數。
當您通過該行時,b[0,0] = a您會收到錯誤,提示您試圖將序列壓縮到陣列元素中。
如果您將陣列的資料型別更改b為object,則b期望它的元素為任何舊的object。所以b[0, 1]作為一個數字和b[0, 0]作為一個陣列你不會有任何問題。像這樣:
import numpy as np
b = np.zeros((2, 2), dtype=object)
a = np.array([[0, 1], [1, 2]])
b[0, 0] = a
如果這看起來過于沉悶/詳細,請注意這是與 numpy.conf 的權衡之一。Numpy 以“更接近金屬”為代價提供速度升級。型別規范是這些升級之一。
此外,您可能只是在玩,但總的來說,我非常建議某人在實踐中不要使用這樣的 numpy 陣列(因為可能有更好的資料結構來滿足您的需求)。
編輯:
如果您的意圖是廣播a到2x2從位置(0,0)in開始的子矩陣b,那么這個例子可能會有所幫助:
import numpy as np
b = np.zeros((4, 4))
a = np.array([[0, 1],[1,2]])
c = np.array([[3, 4],[5,6]])
b[0:0 a.shape[0], 0:0 a.shape[1]] = a
b[2:2 c.shape[0], 2:2 c.shape[1]] = c
print(b)
# [[ 0. 1. 0. 0.]
# [ 1. 2. 0. 0.]
# [ 0. 0. 3. 4.]
# [ 0. 0. 5. 6.]]
這種在 numpy 陣列上操作的方式(陣列存盤結構本身不會改變,只是元素的值)非常好。這是因為numpy的知道先驗在存盤器多少空間分配用于陣列時的資料型別是一個算一個像float64或int。相比之下,當使用帶有 dtype 的 numpy 時object,陣列會不斷地在記憶體中寫入和重寫——這是一個昂貴的程序,它抵消了使用 numpy 的巨大好處(即,陣列操作的速度改進)。
uj5u.com熱心網友回復:
僅使用標題“將陣列存盤到另一個陣列的特定位置”,以下代碼執行此操作:
a = ['x', 'y']
b = [1, 2, 3]
b.insert(0, a)
print(b)
# Outputs
# [['x', 'y'], 1, 2, 3]
可以像這樣控制索引:
b.insert(1, a)
# Outputs
# [1, ['x', 'y'], 2, 3]
uj5u.com熱心網友回復:
這取決于您想要實作的目標。如果要覆寫陣列的相應“補丁” b,則使用切片:
b[0:2, 0:2] = a # or b[:, :] if a and b has the same shapes
print(b)
# [[0. 1.]
# [1. 2.]]
另一方面,雖然很少如此,但如果您想將第[0, 0]th 個元素設定為陣列a,請嘗試(注意dtype=object):
import numpy as np
b = np.zeros([2, 2], dtype=object)
a = np.array([[0, 1], [1, 2]])
b[0, 0] = a
print(b)
# [[array([[0, 1],
# [1, 2]]) 0]
# [0 0]]
這樣b[0, 0]現在是一個陣列,b[0, 1] == 0(一個數字),等等。同樣,這很少是您想要的,并且通常會避免。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/364815.html
