使用numpy创建特定的数组

wnu*_*ers 2 python numpy

我想用numpy创建这种数组:

[[[0,0,0], [1,0,0], ..., [1919,0,0]],
 [[0,1,0], [1,1,0], ..., [1919,1,0]],
 ...,
 [[0,1019,0], [1,1019,0], ..., [1919,1019,0]]]
Run Code Online (Sandbox Code Playgroud)

我可以通过以下方式访问:

>>> data[25][37]
array([25, 37, 0])
Run Code Online (Sandbox Code Playgroud)

我试过用这种方式创建一个数组,但它并不完整:

>>> data = np.mgrid[0:1920:1, 0:1080:1].swapaxes(0,2).swapaxes(0,1)
>>> data[25][37]
array([25, 37])
Run Code Online (Sandbox Code Playgroud)

你知道怎么用numpy解决这个问题吗?

Div*_*kar 5

方法#1:这是np.ogridarray-initialization- 的一种方式

def indices_zero_grid(m,n):
    I,J = np.ogrid[:m,:n]
    out = np.zeros((m,n,3), dtype=int)
    out[...,0] = I
    out[...,1] = J
    return out
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [550]: out = indices_zero_grid(1920,1080)

In [551]: out[25,37]
Out[551]: array([25, 37,  0])
Run Code Online (Sandbox Code Playgroud)

方法#2:@unutbu的修改进行修改@senderle's cartesian_product并受其启发-

import functools
def indices_zero_grid_v2(m,n):
    """
    Based on cartesian_product
    http://stackoverflow.com/a/11146645 (@senderle)
    Inspired by : https://stackoverflow.com/a/46135435 (@unutbu)
    """
    shape = m,n
    arrays = [np.arange(s, dtype='int') for s in shape]
    broadcastable = np.ix_(*arrays)
    broadcasted = np.broadcast_arrays(*broadcastable)
    rows, cols = functools.reduce(np.multiply, broadcasted[0].shape), \
                                                  len(broadcasted)+1
    out = np.zeros(rows * cols, dtype=int)
    start, end = 0, rows
    for a in broadcasted:
        out[start:end] = a.reshape(-1)
        start, end = end, end + rows
    return out.reshape(-1,m,n).transpose(1,2,0)
Run Code Online (Sandbox Code Playgroud)

运行时测试 -

In [2]: %timeit indices_zero_grid(1920,1080)
100 loops, best of 3: 8.4 ms per loop

In [3]: %timeit indices_zero_grid_v2(1920,1080)
100 loops, best of 3: 8.14 ms per loop
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 5

In [50]: data = np.mgrid[:1920, :1080, :1].transpose(1,2,3,0)[..., 0, :]

In [51]: data[25][37]
Out[51]: array([25, 37,  0])
Run Code Online (Sandbox Code Playgroud)

注意data[25][37]两次调用__getitem__.使用NumPy数组,您可以使用以下命令更有效地访问相同的值(通过一次调用__getitem__)data[25, 37]:

In [54]: data[25, 37]
Out[54]: array([25, 37,  0])
Run Code Online (Sandbox Code Playgroud)