Как добавить размеры к элементу NumPy? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть numpy.array, как этот

[[1,2,3]
 [4,5,6]
 [7,8,9]]

Как я могу изменить его на это: -

[[[1,0], [2,0], [3,0]]
 [[4,0], [5,0], [6,0]]
 [[7,0], [8,0], [9,0]]]

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Отказ от ответственности: Этот быстрый (для больших операндов), но довольно ненадежный.Также это работает только для 32 или 64-битных dtypes.Не используйте в серьезном коде.

def squeeze_in_zero(a):
    sh = a.shape
    n = a.dtype.itemsize
    return a.view(f'f{n}').astype(f'c{2*n}').view(a.dtype).reshape(*a.shape, 2)

По скорости на 10000 элементов на моей машине это примерно соответствует назначению массива @ Divakar.Ниже он медленнее, выше он быстрее.

Пример запуска:

>>> a = np.arange(-4, 5).reshape(3, 3)
>>> squeeze_in_zero(a)
array([[[-4,  0],
        [-3,  0],
        [-2,  0]],

       [[-1,  0],
        [ 0,  0],
        [ 1,  0]],

       [[ 2,  0],
        [ 3,  0],
        [ 4,  0]]])
0 голосов
/ 23 октября 2018

С a в качестве входного массива вы можете использовать array-assignment, и это будет работать для универсального n-dim ввода -

out = np.zeros(a.shape+(2,),dtype=a.dtype)
out[...,0] = a

Пример выполнения -

In [81]: a
Out[81]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [82]: out = np.zeros(a.shape+(2,),dtype=a.dtype)
    ...: out[...,0] = a

In [83]: out
Out[83]: 
array([[[1, 0],
        [2, 0],
        [3, 0]],

       [[4, 0],
        [5, 0],
        [6, 0]],

       [[7, 0],
        [8, 0],
        [9, 0]]])

Если вы играете с broadcasting, вот вам компактный -

a[...,None]*[1,0]
0 голосов
/ 23 октября 2018

Если вы вводите целое число без знака и ваш тип dtype «достаточно большой», вы можете использовать следующий код для заполнения нуля без создания копии:

b = str(a.dtype).split('int')
b = a[...,None].view(b[0]+'int'+str(int(b[1])//2))

с a, равным вашему примеру,вывод выглядит как

array([[[1, 0],
        [2, 0],
        [3, 0]],

       [[4, 0],
        [5, 0],
        [6, 0]],

       [[7, 0],
        [8, 0],
        [9, 0]]], dtype=int16)
0 голосов
/ 23 октября 2018

Я думаю, что numpy.dstack может обеспечить решение.Давайте назовем ваш первый массив.Do

B = np.zeros((3,3))
R = np.dstack((A,B))

И R должен быть массивом, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...