ND에서 1D 어레이로


141

배열이 있다고 가정 해보십시오 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에서 열 / 행 벡터를 얻는 차원 독립적 방법이 있습니까?

답변:


277

사용 np.ravel (1 차원보기의 경우) 또는 np.ndarray.flatten (1 차원의 사본) 또는 np.ndarray.flat (AN 1D 반복자를 위해) :

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()반환 viewa가능한 때를. 따라서 수정 b도 수정 a됩니다. ravel()view1D 요소가 메모리에서 연속적 일 때 a를 반환하지만 copy, 예를 들어 a비 단위 스텝 크기 (예 :)를 사용하여 다른 배열을 슬라이스하여 만든 경우 if를 반환합니다 a = x[::2].

보기보다는 사본을 원한다면

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

반복자를 원한다면 np.ndarray.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]

4
<pedantic>이 예제에서는 ravel()뷰를 반환하지만 항상 그런 것은 아닙니다. 경우가 있습니다 ravel()사본을 반환은 </ 현학적>.
워렌 Weckesser

3
a.ravel()약 3 배 빠른 것 같습니다 a.reshape(-1). a.flatten()복사해야하므로 속도가 느립니다.
BallpointBen

25
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])

11
b = a.reshape(-1)첫 번째 예에서 짧게 사용할 수 있습니다 .
Syrtis 메이저

5

가장 간단한 방법 중 하나는 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 '(?,)' 

4

크기가 다른 배열 목록을 보려면 다음을 사용하십시오.

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]


a다시 모양을 어떻게 얻 b습니까?
dvdblk

1D를 청크로 나누려면 이 stackoverflow.com/a/8495740/6117565
bikram

4

unutbu 's를 포함한 답변에 언급 된 함수의 벤치 마크 결과를보고 싶었습니다 .

또한 numpy docarr.reshape(-1) 은보기가 바람직한 경우 에 사용하는 것이 좋습니다 . ( ravel다음 결과에서는 더 빠르지 만 )


TL; DR : np.ravel가장 성능이 뛰어납니다 (매우 소량).

기준

기능 :

numpy 버전 : '1.18.0'

서로 다른 ndarray크기의 실행 시간

+-------------+----------+-----------+-----------+-------------+
|  function   |   10x10  |  100x100  | 1000x1000 | 10000x10000 |
+-------------+----------+-----------+-----------+-------------+
| ravel       | 0.002073 |  0.002123 |  0.002153 |    0.002077 |
| reshape(-1) | 0.002612 |  0.002635 |  0.002674 |    0.002701 |
| flatten     | 0.000810 |  0.007467 |  0.587538 |  107.321913 |
| flat        | 0.000337 |  0.000255 |  0.000227 |    0.000216 |
+-------------+----------+-----------+-----------+-------------+

결론

ravelreshape(-1)의 실행 시간이 ndarray 크기와 일치하고 독립적이었다. 그러나 ravel속도는 빠르지 만 reshape크기 변경에 유연성을 제공합니다. (아마도 numpy doc 이 대신 사용하는 것이 좋습니다. 또는 reshapeview를 반환하고 ravel그렇지 않은 경우 가 있습니다 ).
대형 ndarray를 처리하는 경우 사용 flatten하면 성능 문제가 발생할 수 있습니다. 사용하지 않는 것이 좋습니다. 다른 작업을 수행하기 위해 데이터 사본이 필요하지 않는 한.

사용 된 코드

import timeit
setup = '''
import numpy as np
nd = np.random.randint(10, size=(10, 10))
'''

timeit.timeit('nd = np.reshape(nd, -1)', setup=setup, number=1000)
timeit.timeit('nd = np.ravel(nd)', setup=setup, number=1000)
timeit.timeit('nd = nd.flatten()', setup=setup, number=1000)
timeit.timeit('nd.flat', setup=setup, number=1000)

0

이것은 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's 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.