質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3695閲覧

Python 3次元配列を4次元に増やして一次配列を加えたい

shiri

総合スコア12

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/09 08:46

編集2020/10/09 09:08

すでにある3次元の配列を4次元、5次元、、、と増やしたいです。
次元を増やす際には一次配列を一つづつ足していきたいのですが
numpyのstackを使うと形が合わないとエラーを返されてしまいます。
このようなケースではどのようにすればよいでしょうか?

data = [[1,2,3],[4,5,6]]
data2 = [[7,8,9],["A","B","C"]]
x1 = np.array(data)
x2 = np.array(data2)
out = np.stack([x1,x2])

-out結果(期待通り)--
array([[
['1', '2', '3'],
['4', '5', '6']],

[['7', '8', '9'], ['A', 'B', 'C']]]

上記3次元のoutにdata3を4次配列目として加える
data3 = ["D","F","C"]
x3 = np.array(data3)

np.stack([out,x3])
--out結果(形があわないエラー)
raise ValueError('all input arrays must have the same shape')
ValueError: all input arrays must have the same shape

他にappendやextend、vstack等を試しましたがうまくいきませんでした
基本的にnumpyでは要素数があっていないと結合できないのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/10/09 10:43

前半の例は、2次元のdatと2次元のdat2を使って3次元のoutを作りますよね。 2次元+2次元=3次元ですよね。 同様に、3次元のoutにdata3を使って4次元を作るには、data3は3次元である必要があります。 3次元+3次元=4次元です。 例示したdata3からは、4次元配列は作れないと思います。 3次元+1次元=4次元と勘違いしていませんか?
shiri

2020/10/09 11:32

はい、ご指摘の通りだと思います。 言い直すと array([ [['1', '2', '3'], ['4', '5', '6']], [['7', '8', '9'], ['A', 'B', 'C']], [['D','F','C]] ] このような出力をさせたいのです。三次元の配列3番目に新しく配列を加える。が正しい言い方でしょうか? で、どのようにすれば、というところで悩んでいます
toast-uz

2020/10/09 11:46

それは無理なのではないでしょうか? 「1行目が3列あり2行目が2列しかない行列を作りたい」と同義です。
shiri

2020/10/09 11:51

以下をそのままpythonに打ちこんで data = [ [['1', '2', '3'], ['4', '5', '6']], [['7', '8', '9'], ['A', 'B', 'C']], [['D','F','C'], ] data[2]をD,F,Cとして正しく返してくれますのでデータとして作れないことはないと考えています
toast-uz

2020/10/09 11:51

無理やり作るとnumpyからこういう警告が出ます。 VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray 意訳すると「長さが違うなら行列として扱わないで、オブジェクトの配列として扱え」とのこと。
toast-uz

2020/10/09 11:56

numpyではなく、リストでしたら作れます。リストは縦横はあまり意識しない構造ですので。 次元でも無い、numpyも使わない、ということでしたら、当初の質問意図からは大きくズレてきます。
shiri

2020/10/09 12:00

ちょっとおいついていないのですがNumpyで無理ということで理解します ありがとうございました
toast-uz

2020/10/09 12:03

はい。質問に沿った回答をいったんさせていただきます。
guest

回答2

0

「基本的にnumpyでは要素数があっていないと結合できないのでしょうか」というご質問に関しては、その通り、と回答します。

numpyで無理やり要素数が異なるndarray型を作成してみました。

Python

1import numpy as np 2 3arr = np.array([ 4 ['1', '2', '3'], 5 ['4', '5']])

するとこのように怒られます。

VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray

要素数が異なるため、この場合は、行列ではなく、オブジェクトの配列として扱う必要がある、とのことです。異なる要素数のところは新たな次元として認識できないようです。

投稿2020/10/09 12:09

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

これは参考になりますでしょうか。

>>> import numpy as np >>> a = np.empty((0,3,4,5),float) >>> a = np.append( a, np.arange(1*3*4*5).reshape(1,3,4,5),axis=0) >>> a = np.append( a, np.arange(1*3*4*5).reshape(1,3,4,5)+1,axis=0) >>> a = np.append( a, np.arange(1*3*4*5).reshape(1,3,4,5)+2,axis=0) >>> a.size 180 >>> a.shape (3, 3, 4, 5) >>> a.dtype dtype('float64') >>> a array([[[[ 0., 1., 2., 3., 4.], [ 5., 6., 7., 8., 9.], [10., 11., 12., 13., 14.], [15., 16., 17., 18., 19.]], [[20., 21., 22., 23., 24.], [25., 26., 27., 28., 29.], [30., 31., 32., 33., 34.], [35., 36., 37., 38., 39.]], [[40., 41., 42., 43., 44.], [45., 46., 47., 48., 49.], [50., 51., 52., 53., 54.], [55., 56., 57., 58., 59.]]], [[[ 1., 2., 3., 4., 5.], [ 6., 7., 8., 9., 10.], [11., 12., 13., 14., 15.], [16., 17., 18., 19., 20.]], [[21., 22., 23., 24., 25.], [26., 27., 28., 29., 30.], [31., 32., 33., 34., 35.], [36., 37., 38., 39., 40.]], [[41., 42., 43., 44., 45.], [46., 47., 48., 49., 50.], [51., 52., 53., 54., 55.], [56., 57., 58., 59., 60.]]], [[[ 2., 3., 4., 5., 6.], [ 7., 8., 9., 10., 11.], [12., 13., 14., 15., 16.], [17., 18., 19., 20., 21.]], [[22., 23., 24., 25., 26.], [27., 28., 29., 30., 31.], [32., 33., 34., 35., 36.], [37., 38., 39., 40., 41.]], [[42., 43., 44., 45., 46.], [47., 48., 49., 50., 51.], [52., 53., 54., 55., 56.], [57., 58., 59., 60., 61.]]]])

投稿2020/10/09 09:26

firegrape

総合スコア902

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiri

2020/10/09 09:40

ご説明がないので私がコードを読んだ限りですが これは単に同じ型で3次元→4次元に増やしているのではないでしょうか? ではなくて、3次元に一つ配列を足してそれを新たな4次元目としたいのです
shiri

2020/10/09 12:07

Numpyで無理ということで理解しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問