programing

ND에서 1D 어레이까지

randomtip 2023. 6. 10. 16:29
반응형

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]을 연결해야 함).

임의의 nd 배열에서 열/행 벡터를 가져오는 차원 독립적인 방법이 있습니까?

np.travel(1D 보기의 경우) 또는 np.nd 배열을 사용합니다.플랫(1D 복사본의 경우) 또는 np.nd 배열.플랫(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()를 반환합니다.view이지만 1D 요소가 copy예를 들면,a 크기 단가아닌단크계사기예를다용여하배만슬른다여들니하습었스라이열을위예▁using▁(만(▁were:다▁slic니▁made들▁size▁array습었▁a)를 사용하여 다른 배열을 .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]
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])

저는 unutbu를 포함한 답변에 언급된 기능의 벤치마크 결과를 보고 싶었습니다.

또한 멍청이 의사가 사용할 것을 권장한다는 것을 지적하고 싶습니다.arr.reshape(-1)시야가 더 좋은 경우.(비록ravel 더 )


TL;DR: 가장 성능이 우수합니다(극소량).

벤치마크

기능:

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 |
+-------------+----------+-----------+-----------+-------------+

결론

ravel그리고.reshape(-1)의 실행 시간은 ndarray 크기와 일관되고 독립적이었습니다. 하만지,ravel조금 빠르긴 하지만,reshape크기를 유연하게 조정할 수 있습니다.(아마도 그래서 numpy 의사가 대신 그것을 사용할 것을 추천하는 이유일 것입니다.아니면 어떤 경우에는reshape 및 뷰반니다합을 합니다.ravel하지 않음).
ndarray를 에는 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)

크기가 다른 배열 목록의 경우 다음을 사용합니다.

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]

가장 간단한 방법 중 하나는 사용하는 것입니다.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 '(?,)' 

비록 이것이 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

제안된 모든 솔루션 중에서 가장 빠르고 최적의 솔루션:np.reshape()

%timeit img1ary = np.reshape(img2ary,(np.product(img2ary.shape),1))
9.3 µs ± 69.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit img1ary = img2ary.ravel()
157 ns ± 1.32 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit img1ary = img2ary.flatten()
961 ns ± 5.77 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

언급URL : https://stackoverflow.com/questions/13730468/from-nd-to-1d-arrays

반응형