从numpy数组中创建多维空值或者多维空值

时间:2013-05-03 13:16:48

标签: python arrays numpy multidimensional-array

我想创建一个基于此数组填充1或0的数组

testArray = np.array([7,5,3])

因此最终结果应该是

[[1,1,1,1,1,1,1],
 [1,1,1,1,1],
 [1,1,1]]

4 个答案:

答案 0 :(得分:1)

numpy数组中的每一行(和列等)必须具有相同的长度。您可以实现@ChrisWilson4所做的工作,并使用0np.nan填充空白部分。创建一个空数组,其行数等于lengths的长度,列数等于最大行:

fill = 1    # or `0` or `np.nan`
background = 0 # or `np.nan`
lengths = np.array([7,5,3])

a = np.ones((lengths.size, lengths.max()))*background

并填写fill值:

for row, length in enumerate(lengths):
    a[row,:length] = fill

a
#array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.],
#       [ 1.,  1.,  1.,  1.,  1.,  0.,  0.],
#       [ 1.,  1.,  1.,  0.,  0.,  0.,  0.]])

或者,对于fill = 0background = np.nan

array([[  0.,   0.,   0.,   0.,   0.,   0.,   0.],
       [  0.,   0.,   0.,   0.,   0.,  nan,  nan],
       [  0.,   0.,   0.,  nan,  nan,  nan,  nan]])

或者,您可以使用纯python方式(不使用numpy)制作列表列表,如下所示:

fill = 1
lengths = [7,5,3]
a = [ [fill]*length for length in lengths ]

a
#[[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1]]

答案 1 :(得分:1)

这会给你一个参差不齐的object dtype:

数组
>>> result = np.array([np.ones(a) for a in testArray])
>>> print result
[[ 1.  1.  1.  1.  1.  1.  1.] [ 1.  1.  1.  1.  1.] [ 1.  1.  1.]]

对于零,只需使用np.zeros

答案 2 :(得分:1)

写一个快速列表理解:

>>> holder = [np.ones((testArray[i])) for i in range(len(testArray))]
>>> holder
[array([[ 1.,  1.,  1.,  1.,  1.,  1.,  1.]]), array([[ 1.,  1.,  1.,  1.,  1.]]), array([[ 1.,  1.,  1.]])]

如果您希望它采用写入格式,您可以随时重塑它:

>>> np.array(holder).reshape(3,1)
array([[array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.])],
       [array([ 1.,  1.,  1.,  1.,  1.])],
       [array([ 1.,  1.,  1.])]], dtype=object)

问题解决了!

答案 3 :(得分:-1)

像@JoshAdel一样在评论中说,int数组不能被锯齿,意味着行的长度不能不同。这是你在找什么?

public class soArray {
public static void main(String[] args) {

    int[][] testArray = soArray.array(7,5,3);

    for (int i = 0; i < testArray.length; i++){
        for (int j = 0; j < testArray[0].length; j++){
            System.out.print(testArray[i][j]);
        }
        System.out.println();
    }
}
public static int[][] array(int a, int b, int c){

    int max;
    if(a > b && a > c)
        max = a;
    else if(b > a && b > c)
        max = b;
    else
        max = c;

    int[][] out = new int[3][max];

    for (int i = 0; i < max; i++){
        if(i < a)
            out[0][i] = 1;
        else
            out[0][i] = 0;
    }
    for(int i = 0; i< b; i++){
        if(i < b)
            out[1][i] = 1;
        else
            out[1][i] = 0;
    }
    for(int i = 0; i < c; i++){
        if(i < c)
            out[2][i] = 1;
        else
            out[2][i] = 0;
    }

    return out;
}

}

它会打印出来:

  

1111111

     

1111100

     

1110000