是有可能,在一個快速的方式,來創建(大)2D numpy的陣列numpy的陣列創建有圖案
包含一個值,每行
n
倍(隨機放置)。例如,用於n = 3
1 0 1 0 1 0 0 1 1 1 1 1 1 0 0 ...
相同1.,但大小
n
每行隨機的地方的基團。例如1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 ...
,我可以列舉所有的行,但我想知道如果有一種方法來創建一個使用np.fromfunction
或者一些更快捷的方式排列?
是有可能,在一個快速的方式,來創建(大)2D numpy的陣列numpy的陣列創建有圖案
包含一個值,每行n
倍(隨機放置)。例如,用於n = 3
1 0 1 0 1
0 0 1 1 1
1 1 1 0 0
...
相同1.,但大小n
每行隨機的地方的基團。例如
1 1 1 0 0
0 0 1 1 1
1 1 1 0 0
...
,我可以列舉所有的行,但我想知道如果有一種方法來創建一個使用np.fromfunction
或者一些更快捷的方式排列?
第一個問題的答案有一個簡單的單行解決方案,我認爲它非常高效。像np.random.shuffle或np.random.permutation這樣的函數必須在底層做類似的事情,但是它們需要在行上使用python循環,如果行數非常短,這可能會成爲問題。
第二個問題也有一個純粹的numpy解決方案應該是相當有效的,雖然它有點不那麼優雅。
import numpy as np
rows = 20
cols = 10
n = 3
#fixed number of ones per row in random places
print (np.argsort(np.random.rand(rows, cols)) < n).view(np.uint8)
#fixed number of ones per row in random contiguous place
data = np.zeros((rows, cols), np.uint8)
I = np.arange(rows*n)/n
J = (np.random.randint(0,cols-n+1, (rows,1))+np.arange(n)).flatten()
data[I, J] = 1
print data
編輯:這裏是一個稍長,但更優雅,更高性能的解決方案,你的第二個問題:
import numpy as np
rows = 20
cols = 10
n = 3
def running_view(arr, window, axis=-1):
"""
return a running view of length 'window' over 'axis'
the returned array has an extra last dimension, which spans the window
"""
shape = list(arr.shape)
shape[axis] -= (window-1)
assert(shape[axis]>0)
return np.lib.index_tricks.as_strided(
arr,
shape + [window],
arr.strides + (arr.strides[axis],))
#fixed number of ones per row in random contiguous place
data = np.zeros((rows, cols), np.uint8)
I = np.arange(rows)
J = np.random.randint(0,cols-n+1, rows)
running_view(data, n)[I,J,:] = 1
print data
對於每行解決方案的固定數目,我也會得到'[1,2,1,0,0]' - 那麼訣竅是否可以使用'> 0'掩碼? – HTTPeter
好點;我使用除法的唯一原因是在陣列上單次傳遞獲得所需的int結果;但事實上該解決方案只有在n
所有你需要導入numpy的一些功能第一:
from numpy.random import rand, randint
from numpy import array, argsort
案例1:
a = rand(10,5)
b=[]
for i in range(len(a)):
n=3 #number of 1's
b.append((argsort(a[i])>=(len(a[i])-n))*1)
b=array(b)
結果:
print b
array([[ 1, 0, 0, 1, 1],
[ 1, 0, 0, 1, 1],
[ 0, 1, 0, 1, 1],
[ 1, 0, 1, 0, 1],
[ 1, 0, 0, 1, 1],
[ 1, 1, 0, 0, 1],
[ 0, 1, 1, 1, 0],
[ 0, 1, 1, 0, 1],
[ 1, 0, 1, 0, 1],
[ 0, 1, 1, 1, 0]])
案例2:
a = rand(10,5)
b=[]
for i in range(len(a)):
n=3 #max number of 1's
n=randint(0,(n+1))
b.append((argsort(a[i])>=(len(a[i])-n))*1)
b=array(b)
結果:
print b
array([[ 0, 0, 1, 0, 0],
[ 0, 1, 0, 1, 0],
[ 1, 0, 1, 0, 1],
[ 0, 1, 1, 0, 0],
[ 1, 0, 1, 0, 0],
[ 1, 0, 0, 1, 1],
[ 0, 1, 1, 0, 1],
[ 1, 0, 1, 0, 0],
[ 1, 1, 0, 1, 0],
[ 1, 0, 1, 1, 0]])
我認爲可以工作。爲了得到結果,我生成隨機浮點列表,並用「argsort」查看那些列表中的n個最大值,然後我將它們作爲整數(布爾值1 - > int)進行過濾。
僅僅爲了它的樂趣,我試圖爲你的第一個問題找到一個解決方案,即使我對Python很陌生。這裏是我到目前爲止有:
np.vstack([np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0])),
np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0])),
np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0])),
np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0])),
np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0])),
np.hstack(np.random.permutation([np.random.randint(0,2),
np.random.randint(0,2), np.random.randint(0,2), 0, 0, 0]))])
array([[1, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 1],
[0, 1, 0, 1, 0, 0],
[0, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 1]])
這不是最終的答案,但也許它可以幫助你找到使用隨機數和排列的替代解決方案。
你想爲行特定的概率分佈有1個,2個或3那些? – EOL
這個問題似乎是無關緊要的,因爲它沒有顯示出解決問題的嘗試。 – 2014-02-08 05:03:50
@EOL:在一行中,不需要概率分佈。 – HTTPeter