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(1D図の場合)またはnp.ndarray.flatten(1Dコピー)またはnp.ndarray.flat(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ます。1D要素がメモリ内で隣接してravel()いるview場合はaを返しますが、copyたとえば、a非ユニットステップサイズ(たとえばa = x[::2])を使用して別の配列をスライスした場合は、aを返します。

ビューではなくコピーが必要な場合は、

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()コピーが返される場合があります。</
pedantic

3
a.ravel()はの約3倍の速さa.reshape(-1)です。a.flatten()コピーを作成する必要があるため、速度はかなり遅くなります。
BallpointBen 2018

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 Major、

5

最も簡単な方法の1つは、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を含む回答で言及されている関数のベンチマーク結果を見たかった。

また、ビューが望ましい場合は、numpy docを使用することarr.reshape(-1)をお勧めします。(ravel次の結果では少し速くなりますが)


TL; DRnp.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 |
+-------------+----------+-----------+-----------+-------------+

結論

ravelそして、reshape(-1)の実行時間がndarrayサイズから一貫して独立していました。ただし、ravel少し速くなりreshapeますが、サイズを柔軟に変更できます。(たぶんそれがnumpy docが代わりにそれを使用することを推奨する理由です。または、reshapeビューが返され、返され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.