@taki04 (海希 柊)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

listに格納したいです💦

解決したいこと

お疲れ様です!
お忙しい中すみませんが答えていただけると幸いです!
今,dataという552200行の7列のlistの中から
7列目の552200個の値を(1000,22,251)のlistに入れたいです!
7列目の上から順に251個詰めて,251個入った箱が22箱溜まったら
それをその22箱を1セットとして,1000セットにするという風にしたいです!💦
今は下記のようなコードを書きましたが,下記のようなエラーが出ています!

import numpy as np

file = open('rv5')
data = [x for x in list(map(lambda x: list(map(float, x.strip().split(' '))), list(file))) if len(x) > 3]
file.close()

data = np.array(data)
print(data)

nZ=251
nR=22
Nd=1000

nZi=125
dZ=4

dat=np.empty([Nd,nR,nZ])
for i in range(Nd):
    for j in range(nR):
        for k in range(nZ):
dat[i,j,k]=data[6]





ValueError: setting an array element with a sequence.
0 likes

2Answer

  • ValueError: setting an array element with a sequenceは、「配列のshapeが合わない」みたいなエラーです。代入式の左辺と右辺で、データの形が異なるのです。
    • 左辺は、3次元配列の単一要素なので、スカラですね。右辺は何でしょうか。
  • dataは「552200行の7列」の2次元配列ですから、data[《スカラ》]では、1行分7列のリストが取り出されます。
    • data[《行》, 《列》]と指定することで、目的のスカラが取り出せます。
    • 列は固定ですが、行は、取り出す毎に、インクリメントされる必要がありますね。
  • datは、1000*22*251で、5,522,000要素あります。しかし、dataは「552200行」しかありません。
    • 取り出すデータが不足して、添え字が範囲外になりエラーする可能性があります。
    • Nd = 100か、「5522000行」か、ではないでしょうか?

例えば、以下のようなコードになります。

import numpy as np

file = open('rv5')
data = [x for x in map(lambda x: list(map(float, x.strip().split(' '))), file) if len(x) > 3]
file.close()

data = np.array(data)
print(f"data=\n{data}\n")

# for data
di = 0
dj = 6

# for dat
nZ = 251
nR = 22
Nd = 1000

# ??
nZi = 125
dZ = 4

dat = np.empty([Nd, nR, nZ])
for i in range(Nd):
    for j in range(nR):
        for k in range(nZ):
            print(f"dat[{i}, {j}, {k}] = data[{di}, {dj}] ({data[di, dj]})")
            dat[i, j, k] = data[di, dj]
            di += 1
print(f"\ndat=\n{dat}")

追記

ループを使わずに、よりシンプルに書いた例です。

import numpy as np

file = open('rv5')
data = [x for x in map(lambda x: list(map(float, x.strip().split(' '))), file) if len(x) > 3]
file.close()

data = np.array(data)
print(f"data=\n{data}\n")

# for data
dj = 6

# for dat
nZ = 251
nR = 22
Nd = 1000

# ??
nZi = 125
dZ = 4

dat = data[:, dj].reshape([Nd, nR, nZ])
print(f"\ndat=\n{dat}")
0Like

Comments

  1. @taki04

    Questioner

    わざわざ、連続で返していただきありがとうございます!
    いろいろと学ぶことも多くしっかり今後に生かしていきたいと思います!
    お忙しい中ありがとうございます!
  2. もしかして、お知りになりたかったことと、ズレていたでしょうか?
    ちゃんとご質問に対する回答になっていれば良いのですが。
    (連続になったのはたまたまです。)
    ---
    ループを使わない例を追記いたしました。

数が合わない...それも含めて

dat = np.array([x[6] for x in data]).reshape(-1, 22, 251)

でどうでしょう?

あと、表題ですが、list ではなく ndarray じゃないでしょうか?
似てますが、使いはじめると大分違ってくるので、混同してるとあとあと辛くなってきます。

0Like

Comments

  1. @taki04

    Questioner

    わかりました!
    親切にありがとうございます!💦

Your answer might help someone💌