От ND до 1D массивов

Скажем, у меня есть массив a:

a = np.array([[1,2,3], [4,5,6]])

array([[1, 2, 3],
       [4, 5, 6]])

Я хотел бы преобразовать его в 1D-массив (т.е. вектор-столбец):

b = np.reshape(a, (1,np.product(a.shape)))

но это возвращает

array([[1, 2, 3, 4, 5, 6]])

который не совпадает с:

array([1, 2, 3, 4, 5, 6])

Я могу взять первый элемент этого массива, чтобы вручную преобразовать его в 1D-массив:

b = np.reshape(a, (1,np.product(a.shape)))[0]

но это требует от меня знать, сколько размеров имеет исходный массив (и конкатенация [0] при работе с более высокими размерами)

Существует ли независимый от размера способ получения вектора столбца/строки из произвольного ndarray?

Ответ 1

Используйте np.ravel (для 1D-представления) или np.flatten (для 1D-копии) или np.flat (для 1-го итератора):

In [12]: a = np.array([[1,2,3], [4,5,6]])

In [13]: b = a.ravel()

In [14]: b
Out[14]: array([1, 2, 3, 4, 5, 6])

Обратите внимание, что ravel() возвращает view о, когда это возможно. a Таким образом, модификация b также изменяет a. ravel() возвращает view когда 1D-элементы смежны в памяти, но возвратит copy если, например, a были сделаны из среза другого массива с использованием размера единицы измерения (например, a = x[::2]),,

Если вам нужна копия, а не вид, используйте

In [15]: c = a.flatten()

Если вы просто хотите итератор, используйте np.flat:

In [20]: d = a.flat

In [21]: d
Out[21]: <numpy.flatiter object at 0x8ec2068>

In [22]: list(d)
Out[22]: [1, 2, 3, 4, 5, 6]

Ответ 2

In [14]: b = np.reshape(a, (np.product(a.shape),))

In [15]: b
Out[15]: array([1, 2, 3, 4, 5, 6])

или просто:

In [16]: a.flatten()
Out[16]: array([1, 2, 3, 4, 5, 6])

Ответ 3

Для списка массивов с другим размером используйте следующее:

import numpy as np

# ND array list with different size
a = [[1],[2,3,4,5],[6,7,8]]

# stack them
b = np.hstack(a)

print(b)

Выход:

[1 2 3 4 5 6 7 8]

Ответ 4

Один из самых простых способов - использовать flatten(), как в следующем примере:

 import numpy as np

 batch_y =train_output.iloc[sample, :]
 batch_y = np.array(batch_y).flatten()

Мой массив это было так:

    0
0   6
1   6
2   5
3   4
4   3
.
.
.

После использования flatten():

array([6, 6, 5, ..., 5, 3, 6])

Это также решение ошибок этого типа:

Cannot feed value of shape (100, 1) for Tensor 'input/Y:0', which has shape '(?,)' 

Ответ 5

Хотя это не использует формат массива np, (лениво изменять мой код) это должно делать то, что вы хотите... Если вы действительно хотите вектор столбца, вы захотите транспонировать результат вектора. Все зависит от того, как вы планируете использовать это.

def getVector(data_array,col):
    vector = []
    imax = len(data_array)
    for i in range(imax):
        vector.append(data_array[i][col])
    return ( vector )
a = ([1,2,3], [4,5,6])
b = getVector(a,1)
print(b)

Out>[2,5]

Так что если вам нужно транспонировать, вы можете сделать что-то вроде этого:

def transposeArray(data_array):
    # need to test if this is a 1D array 
    # can't do a len(data_array[0]) if it 1D
    two_d = True
    if isinstance(data_array[0], list):
        dimx = len(data_array[0])
    else:
        dimx = 1
        two_d = False
    dimy = len(data_array)
    # init output transposed array
    data_array_t = [[0 for row in range(dimx)] for col in range(dimy)]
    # fill output transposed array
    for i in range(dimx):
        for j in range(dimy):
            if two_d:
                data_array_t[j][i] = data_array[i][j]
            else:
                data_array_t[j][i] = data_array[j]
    return data_array_t