私はnumpyで抱えている問題への答えを必要として、3時間近くネットを検索してきました。
.csv ファイルから numpy 配列にデータを読み込んで、matplotlib を使用せずに 3D サーフェス プロットにデータをプロットしています。データ取得はpythonのcsvモジュールで行います。ヘッダーが 1 つの配列に読み込まれ、最初の列が別の配列に読み込まれ、これら 2 つの軸の値に属する残りのデータが 3 番目の配列に読み込まれます。
まず、「string」配列と「float」配列を混在させずに適切に表示できるように、「Y」配列を float に変換する必要があることを確認しましたが、これは修正されました。私のプログラムは、「2.633e-12」のような値が見つかるまで、Y 配列の文字列を適切に変換します。
ValueError: float() の無効なリテラル: 2.673e-
変換前に配列から対応する値を出力すると、上記のように出力されます。
以下の完全なプログラムコードを参照してください...
あなたが提供できる助けをいただければ幸いですので、事前に感謝します...
ティム
編集:
トレースバック:
Traceback (most recent call last):
File "Velocities.py", line 49, in <module>
surf = ax.plot_surface(X, Y, avel, rstride=1, cstride=1, cmap=cm.jet)
File "/usr/bin/epd_free/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 1453, in plot_surface
self.auto_scale_xyz(X, Y, Z, had_data)
File "/usr/bin/epd_free/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py", line 392, in auto_scale_xyz
self.xy_dataLim.update_from_data_xy(np.array([x, y]).T, not had_data)
File "/usr/bin/epd_free/lib/python2.7/site-packages/matplotlib/transforms.py", line 854, in update_from_data_xy
path = Path(xy)
File "/usr/bin/epd_free/lib/python2.7/site-packages/matplotlib/path.py", line 112, in __init__
vertices = np.asarray(vertices, np.float_)
File "/usr/bin/epd_free/lib/python2.7/site-packages/numpy/core/numeric.py", line 235, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: invalid literal for float(): 2.673e-
入力ファイルからエラーを生成する行の前後の行:
2.57e-12;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488;-243.476064488
2.673e-12;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317;-243.747334317
2.772e-12;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958;-244.067736958
この問題を解決するのに役立つ回答をいただければ幸いです...
EDIT2:
ここに私が理解した完全なコードがあります.floatへの変換は問題ありませんが、表面プロット自体がトレースバックを引き起こします...
#!/usr/bin/epd_free/bin/python2.7
# -*- coding: utf-8 -*-
##all the necessary imports
import matplotlib as mpl
import matplotlib.pyplot as plt
#import math as m
import csv
import numpy as np
from matplotlib import cm
#from matplotlib.ticker import LinearLocator, FormatStrFormatter
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.ticker as ticker
##reading the data
#reading the velocity profiles from the "velProfiles"
eingabe = "velProfiles_kum.csv"
dat = csv.reader(open(str(eingabe), 'rb'), delimiter=';')
X=dat.next()
X.pop(0)
X=np.array(X)
Y=[]
avel=[]
for i,row in enumerate(dat):
if i%100 == 0:
Y.append(row.pop(0))
avel.append([float(item) for item in row])#if item is not ''
del dat
#Y=np.array(Y)
Y=np.array(Y).astype(np.float64)
avel=np.array(avel) # converting the list into an array to be able to process it with the 3D plotting engine.
##creating the graph and the mesh needed to plot the data. (get the dimensions right!!!)
fig = plt.figure(frameon=False)
ax = fig.gca(projection='3d', lod=True)
X, Y = np.meshgrid(X, Y)
print("X: " + str(X.shape) + "| Y: " + str(Y.shape) + "| Z: " + str(avel.shape)) # to stdout to check the arrays' dimensions
#plotting the surface
surf = ax.plot_surface(X, Y, avel, rstride=1, cstride=1, cmap=cm.jet)
#setting the title and the labels
plt.xlabel("x")
plt.ylabel("t")
plt.title("The simulation's velocity profiles plotted over time and space")
#layout refinements
#plt.tight_layout()
#fig.colorbar(surf, shrink=.8, aspect=12) #create the colorbar after the tight_layout() command to prevent it from being drawn inside the figure.
#show it!
plt.show()