使用模式创建Numpy数组

时间:2014-02-07 19:11:39

标签: python arrays numpy

是否可以快速创建一个(大)2d numpy数组

  1. 每行包含n次值(随机放置)。例如,n = 3

    1 0 1 0 1
    0 0 1 1 1
    1 1 1 0 0
    ...
    
  2. 与1.相同,但每行随机放置该大小n的组。 e.g。

    1 1 1 0 0
    0 0 1 1 1
    1 1 1 0 0
    ...
    
  3. 当然,我可以枚举所有行,但我想知道是否有办法使用np.fromfunction或更快的方式创建数组?

3 个答案:

答案 0 :(得分:1)

第一个问题的答案有一个简单的单行解决方案,我认为这个解决方案非常有效。像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 :(得分:0)

首先,您需要导入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”查看列表中的哪些内容,然后我将它们过滤为int(boolean * 1-&gt; int)。

答案 2 :(得分:0)

只是为了它的乐趣,我试图找到第一个问题的解决方案,即使我是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]])

这不是最终答案,但也许它可以帮助您找到使用随机数和排列的替代解决方案。