[英]Group a numpy array
我有一個一維數組A
,這樣0 <= A[i] <= 11
,我想 map A
到數組B
這樣
for i in range(len(A)):
if 0 <= A[i] <= 2: B[i] = 0
elif 3 <= A[i] <= 5: B[i] = 1
elif 6 <= A[i] <= 8: B[i] = 2
elif 9 <= A[i] <= 11: B[i] = 3
如何在numpy
中有效地實現這一點?
您需要使用 int 除法//3
,這是最高效的解決方案
A = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
B = A // 3
print(A) # [0 1 2 3 4 5 6 7 8 9 10 11]
print(B) # [0 0 0 1 1 1 2 2 2 3 3 3]
我會做一些事情,比如將 A[i] 的值除以 3,因為您將它們 3 除以 3、0-2 除以 3 go 答案 0、3-5 go 答案 1、6-8 除以3 等於 2,以此類推
我在這里建立了一個小架構:
A[i] --> 0-2.
除以 3 = 0,你在數組 B[i] 中的值是 0,所以沒關系A[i] --> 3-5.
除以 3 = 1,依此類推。 只需使用一種方法將 floor 設置為值,使其不會成為浮點類型。
其他人提供的答案是有效的,但是我發現來自 numpy 的 function 非常優雅,而且它可以讓您避免 for 循環,這對於大型 arrays
import numpy as np
bins = [3, 5, 8, 9, 11]
B = np.digitize(A, bins)
像這樣的東西可能會起作用:
C = np.zeros(12, dtype=np.int)
C[3:6] = 1
C[6:9] = 2
C[9:12] = 3
B = C[A]
如果您希望將此擴展為更復雜的示例,您可以使用所有條件定義 function:
def f(a):
if 0 <= a and a <= 2:
return 0
elif 3 <= a and a <= 5:
return 1
elif 6 <= a and a <= 8:
return 2
elif 9 <= a and a <= 11:
return 3
並在您的數組A
上調用它:
A = np.array([0,1,5,7,8,9,10,10, 11])
B = np.array(list(map(f, A))) # array([0, 0, 1, 2, 2, 3, 3, 3, 3])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.