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()
를 반환합니다.view
a
가급적이면수정합니다.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: 가장 성능이 우수합니다(극소량).
벤치마크
기능:
- 가능한 경우 뷰를
np.ravel
반환합니다. - 가능한 경우 뷰를
np.reshape(-1)
반환합니다. - 복사본을
np.flatten
반환합니다. np.flat
와 유사한 반품.
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
'programing' 카테고리의 다른 글
Firestore 문서에 타임스탬프 추가 (0) | 2023.06.10 |
---|---|
마우스 클릭 없이 Excel에서 하이퍼링크를 여는 방법, 바로 가기 키/키가 있습니까? (0) | 2023.06.10 |
-m 옵션을 사용한 Python 코드 실행 여부 (0) | 2023.06.10 |
Wordpress wp_schedule_event 랜덤 30분에서 60분 사이 (0) | 2023.06.10 |
Python에서 파일 잠금 (0) | 2023.06.10 |