如何根据数组中的条件复制 python 中的数组?

How do I make copies of an array in python based on conditions in the array?

我有一个

n = np.array([[1, 12, 1, 3],
              [1, 1, 12, 0]])

并想复制它,这样如果我在数组中有一个两位数,它会将数组分成两个相同的数组,其中第一个数组有第一个数字,第二个数组有第二个数字。在上面的示例中,我将有 4 个矩阵副本。假设数组中有一位数或两位数。

n1 = [1, 1, 1, 3], [1, 1, 1, 0]
n2 = [1, 1, 1, 3], [1, 1, 2, 0]
n3 = [1, 2, 1, 3], [1, 1, 1, 0]
n4 = [1, 2, 1, 3], [1, 1, 2, 0]

方法一:itertools.product

>>> import numpy as np
>>> from itertools import product
>>> from pprint import pprint
>>> 
>>> n = np.array([[1, 12, 1, 3],
...               [1, 1, 12, 0]])
>>> 
>>> pprint([np.reshape(nn, n.shape).astype(int) for nn in product(*map(str, n.ravel()))])
[array([[1, 1, 1, 3],
       [1, 1, 1, 0]]),
 array([[1, 1, 1, 3],
       [1, 1, 2, 0]]),
 array([[1, 2, 1, 3],
       [1, 1, 1, 0]]),
 array([[1, 2, 1, 3],
       [1, 1, 2, 0]])]

请注意,这也适用于更长的数字。

>>> n = np.array([462, 3, 15, 1, 0])
>>> pprint([np.reshape(nn, n.shape).astype(int) for nn in product(*map(str, n.ravel()))])
[array([4, 3, 1, 1, 0]),
 array([4, 3, 5, 1, 0]),
 array([6, 3, 1, 1, 0]),
 array([6, 3, 5, 1, 0]),
 array([2, 3, 1, 1, 0]),
 array([2, 3, 5, 1, 0])]

方法二:np.meshgrid

>>> import numpy as np
>>>
>>> n = np.array([[1, 12, 1, 3],
...               [1, 1, 12, 0]])
>>> 
>>> te = np.where(n>=10)
>>> dims = tuple(np.log10(n[te]).astype(int) + 1)
>>> 
>>> out = np.empty(dims + n.shape, dtype=n.dtype)
>>> out[...] = n
>>> out[(Ellipsis,) + te] = np.moveaxis(np.meshgrid(*(s//10**np.arange(i)[::-1]%10 for i, s in zip(dims, n[te])), indexing='ij'), 0, -1)
>>> 
>>> out
array([[[[1, 1, 1, 3],
         [1, 1, 1, 0]],

        [[1, 1, 1, 3],
         [1, 1, 2, 0]]],


       [[[1, 2, 1, 3],
         [1, 1, 1, 0]],

        [[1, 2, 1, 3],
         [1, 1, 2, 0]]]])