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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1276閲覧

配列の前半と後半を入れ替えて違う配列に入れたい

ryokkun0331

総合スコア2

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/24 13:55

前提・実現したいこと

当該プログラムの#配列の入れ替えg→0含まずg2→0含む のユニット
111行目
1001個ある配列(iso0)の前半500個を後半500個の後ろに挿入したい
(時間で-500^-120500^-12で設定している関数を周期関数として0500^-121000^-12の配列に入れる)
(変換前 -500^-12 ~ -1^-12 , 0 , 1^-12 ~ 500^-12
(変換後 0 , 1^-12 ~ 500^-12 , -500^-12 ~ -1^-12

発生している問題・エラーメッセージ

Traceback (most recent call last):
File "C:\Users\oreka\python\2jigen3.py", line 115, in <module>
iso0g[i] = iso0[i+501]
TypeError: can only concatenate tuple (not "int") to tuple

該当のソースコード

python

1import numpy as np 2import math 3import matplotlib.pyplot as plt 4 5#定数宣言 6a = np.arange(-500.0e-12,600.0e-12,1.0e-12) #500.0e-12~600.0e-12の時間t(要素1100個) 7a2 = np.arange(1,1000,1) #1~1000の整数(kの一行に要素が3つある行の代入に使用) 8a3 = np.arange(-500.0e-12,500.0e-12,1.0e-12) #-500.0e-12~500.0e-12の時間t(要素1001個) 9a4 = np.arange(0,1000.0e-12,1.0e-12)#グラフ用の時間t 10iso0g = np.arange(0,1001,1.0)#配列入れ替え後の入れもん 11isog = np.arange(0,1001,1.0)#配列入れ替え後の入れもん 12iso2g = np.arange(0,1001,1.0)#配列入れ替え後の入れもん 13g = np.arange(0,500,1.0)#0含まない 14g2 = np.arange(501,1001,1.0)#0含む 15k = np.eye(1001) #kの土台(単位行列(1001×1001)) 16A = 100 17B = 217.0e-28 18z = 30.0e+3 19T = 18016836.0e-18 20dz = 15000 21 22#p(t,z)とdp/dzの作成 23p = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * z ,2)) * np.exp((-1 * pow(T* a ,2))/(pow(T ,4)+pow(B * z ,2))) 24#p(a3サイズ) 25pa3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * z ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * z ,2))) 26#p1a3(t+dz) 27p1a3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * (z + dz) ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * (z + dz) ,2))) 28#p2a3(t-dz) 29p2a3 = pow(A * T ,2) / np.sqrt(pow(T ,4)+pow(B * (z - dz) ,2)) * np.exp((-1 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * (z - dz) ,2))) 30 31dpdz = pow(A * T * B ,2) * z * ((2 * pow(T* a3 ,2))/(pow(T ,4)+pow(B * z ,2)) - 1) * pow(pow(T ,4) 32 + pow(B * z ,2) , -1.5) * np.exp(-1 * pow(T* a3 ,2)/(pow(T ,4) + pow(B * z ,2))) 33 34pp = (p1a3 - pa3)/dz#前進差分 35pp2 = (p1a3 - p2a3) /2 /dz#中心差分 36 37#dp/dzの行列を縦一列に変形 38dpdz = dpdz.reshape([1001,1]) 39pp = pp.reshape([1001,1]) 40pp2 = pp2.reshape([1001,1]) 41 42#k(単位行列(1001×1001))の2~1000行にpを繰り返し代入 ※一行に要素が3つある行 43for i in a2: 44 k[i][i-1] = p[i+1] + p[i+2] 45 k[i][i] = -(p[i+1] + 2*p[i+2] + p[i+3]) 46 k[i][i+1] =p[i+2] + p[i+3] 47 48#kの1行目と1001行目にpを代入 ※一行に要素が2つある行 49k[1000][1000] = -(p[1001] + 2*p[1002] + p[1003]) 50k[1000][999] = p[1001] + p[1002] 51k[0][0] = -(p[1] + 2*p[2] + p[3]) 52k[0][1] = p[2] + p[3] 53 54 55kin = np.linalg.inv(k) #kの逆行列kin 56 57b = dpdz / dz / B #作成とb(dpdz)の作成 58b2 = pp / dz / B #b2(前進差分) 59b3 = pp2 / dz / B #b3(中心差分) 60 61 62#各配列にどれだけ要素が入っているかの確認用(shape) 63""" 64print("a") 65print(a.shape) 66print("a2") 67print(a2.shape) 68print("a3") 69print(a3.shape) 70print("k") 71print(k.shape) 72print("p") 73print(p.shape) 74print("dpdz") 75print(dpdz.shape) 76print("kin") 77print(kin.shape) 78""" 79 80#各行列の確認用(shape) 81np.set_printoptions(linewidth=2000,edgeitems=7,precision=4, floatmode='maxprec') 82print("k") 83print(k) 84print("p") 85print(p) 86print("dpdz") 87print(dpdz) 88print("b") 89print(b) 90print("kin") 91print(kin) 92 93#3.13式よりφを計算 94 95iso0 = kin @ b#iso0 b=dpdz 96iso0 = iso0.reshape([1001,]) 97print("iso0") 98print(iso0.shape) 99print(iso0) 100 101iso = kin @ b2#iso b=前進差分 102iso = iso.reshape([1001,]) 103print("iso") 104print(iso.shape) 105print(iso) 106 107iso2 = kin @ b3#iso2 b=中心差分 108iso2 = iso2.reshape([1001,]) 109print("iso2") 110print(iso2.shape) 111print(iso2) 112 113#配列の入れ替えg→0含まずg2→0含む 114for i in enumerate(g): 115 iso0g[i] = iso0[i+501] 116 isog[i] = iso[i+501] 117 iso2g[i] = iso2[i+501] 118 119for i in g2: 120 iso0g[i] = iso0[i-501] 121 isog[i] = iso[i-501] 122 iso2g[i] = iso2[i-501] 123 124#iso確認用 125print("iso0") 126print(iso0g) 127print(iso0g.shape) 128 129 130#各行列のPLOt 131plt.figure(0) 132plt.xlabel("t") 133plt.ylabel("p(t,z)") 134plt.plot(a,p) 135 136plt.figure(1) 137plt.xlabel("t") 138plt.ylabel("bとpp") 139plt.plot(a3,dpdz) 140plt.plot(a3,pp) 141plt.plot(a3,pp2) 142 143plt.figure(2) 144plt.xlabel("t") 145plt.ylabel("φ") 146plt.plot(a4,iso0g) 147plt.plot(a4,isog) 148plt.plot(a4,iso2g) 149 150plt.show() 151 152

試したこと

以前エラーが出た際(float型にする)に関しておは修正しましたがその後がうまくいきません

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

計算後の結果をいれる箱を用意するだけならnumpy.empty()がおすすめです。
どのような型が入るのかを意識したほうがいいです。

前半と後半の入れ替えについては、下記のようにすると一つのループにできます。(もともと書かれているコードでは境界の処理が多分おかしくなっています)

python

1iso0g = np.empty(1001, dtype='float') 2for i in range(len(iso0)): 3 iso0g[i] = iso0[(i + 500) % len(iso0)]

さらに、numpyにはこれをするための便利な関数があって、numpy.roll()関数を使うとループも事前の箱の用意も不要です

python

1iso0g = np.roll(iso0, -500)

投稿2020/10/26 04:22

編集2020/10/26 04:27
bsdfan

総合スコア4794

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

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

ryokkun0331

2020/11/19 08:01

ありがとうございます。
guest

0

2箇所修正が必要です。

まず下記のところ、gとg2はループで使うintである必要があるため、.0をつけてfloatにしてはダメです。

Python

1g = np.arange(0,500,1.0)#0含まない 2g2 = np.arange(501,1001,1.0)#0含む

修正後

Python

1g = np.arange(0,500,1)#0含まない 2g2 = np.arange(501,1001,1)#0含む

次に下記のところ、enumerate()は不要です。iがタプルになってしまいます。

Python

1#配列の入れ替えg→0含まずg2→0含む 2for i in enumerate(g):

修正後

Python

1#配列の入れ替えg→0含まずg2→0含む 2for i in g:

投稿2020/10/24 14:28

toast-uz

総合スコア3266

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

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

ryokkun0331

2020/10/26 00:49

ありがとうございます 修正してみたのですが Traceback (most recent call last): File "C:\Users\oreka\python\2jigen3.py", line 115, in <module> iso0g[i] = iso0[i+501] OverflowError: Python int too large to convert to C long のエラーが出ていしまいます。 これはどちらでエラーが出ているかわかりますでしょうか? どこが原因で発生しているか見当がつきません
toast-uz

2020/10/26 03:45

1つ前の質問に戻っていますので、私が指摘した以外の箇所も修正しているようです。 以下の箇所も.0を削除していませんか? iso0g = np.arange(0,1001,1.0)#配列入れ替え後の入れもん isog = np.arange(0,1001,1.0)#配列入れ替え後の入れもん iso2g = np.arange(0,1001,1.0)#配列入れ替え後の入れもん
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問