0

たとえば、次のようなタプルのリストがあります。

l=[ (2,2,1), (2,4,0), (2,8,0),
    (4,2,0), (4,4,1), (4,8,0),
    (8,2,0), (8,4,0), (8,8,1) ]

そして、それを次のようなnumpy配列に変換したい(x、y座標のシーケンスに対応するマトリックス内のz値のみ、座標は別々に保存する必要があります)):

array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

以下にソリューションを投稿していますが、それはかなり低レベルであり、matplotlib または numpy を使用して、より高度なソリューションが必要だと思います。何か案が?

pcolorimshow、などの matplotlib プロット関数に配列を提供するには、この種の変換が必要contourです。

4

4 に答える 4

2

オプション付きのnp.uniqueが法案に適合しているように見えreturn_inverseます。例えば、

In [203]: l[:,0]
Out[203]: array([2, 2, 2, 4, 4, 4, 8, 8, 8])

In [204]: np.unique(l[:,0], return_inverse = True)
Out[204]: (array([2, 4, 8]), array([0, 0, 0, 1, 1, 1, 2, 2, 2]))

np.unique2タプルを返します。2タプルの最初の配列は、のすべての一意の値の配列ですl[:,0]array([2, 4, 8])2番目の配列は、の値を元の配列の値に関連付けるインデックス値ですl[:,0]np.uniqueソートされた順序で一意の値を返すため、これはランクでもあります。


import numpy as np
import matplotlib.pyplot as plt

l = np.array([ (2,2,1), (2,4,0), (2,8,0),
               (4,2,0), (4,4,1), (4,8,0),
               (8,2,0), (8,4,0), (8,8,1) ])

x, xrank = np.unique(l[:,0], return_inverse = True)
y, yrank = np.unique(l[:,1], return_inverse = True)

a = np.zeros((max(xrank)+1, max(yrank)+1))
a[xrank,yrank] = l[:,2]

fig = plt.figure()
ax = plt.subplot(111)

ax.pcolor(x, y, a)   
plt.show()

収量

ここに画像の説明を入力してください

于 2012-11-04T18:25:36.370 に答える
0

なぜこれをこんなに複雑にしているのかわかりません。あなたはそれを簡単に行うことができます:

array([
    [cell[2] for cell in row] for row in zip(*[iter(x)] * 3)
])

またはおそらくもっと読みやすい:

array([
    [a[2], b[2], c[2]] for a, b, c in zip(x[0::3], x[1::3], x[2::3])
])
于 2012-11-04T18:26:35.757 に答える
0

標準のPython構成セット、リスト、およびソートを使用したソリューション。あなたが多くのポイントを持っていない場合は、unutbuによって与えられた厄介な解決策よりも遅くても読みやすさが向上します

l=[ (2,2,1), (2,4,0), (2,8,0),
    (4,2,0), (4,4,1), (4,8,0),
    (8,2,0), (8,4,0), (8,8,1) ]

#get the ranks of the values for x and y
xi = sorted(list(set( i[0] for i in l )))
yi = sorted(list(set( i[1] for i in l )))
a = np.zeros((len(xi),len(yi)))
#fill the matrix using the list.index
for x,y,v in l:
    a[xi.index(x),yi.index(y)]=v

ax=plt.subplot(111)
ax.pcolor(array(xi), array(yi), a)
于 2012-11-04T18:34:59.783 に答える
0

私のソリューションは、最初に x 値と y 値をランク付けしてから、配列を作成します。

l=[ (2,2,1), (2,4,0), (2,8,0),
    (4,2,0), (4,4,1), (4,8,0),
    (8,2,0), (8,4,0), (8,8,1) ]

def rankdata_ignoretied(data):
   """ranks data counting all tied values as one"""
   # first translate the data values to integeres in increasing order
   counter=0
   encountered=dict()
   for e in sorted(data):
      if e not in encountered:
         encountered[e]=counter
         counter+=1   
   # then map the original sequence of the data values
   result=[encountered[e] for e in data]
   return result

x=[e[0] for e in l]
y=[e[1] for e in l]
z=[e[2] for e in l]

xrank=rankdata_ignoretied(x)
yrank=rankdata_ignoretied(y)

import numpy
a=numpy.zeros((max(xrank)+1, max(yrank)+1))
for i in range(len(l)):
   a[xrank[i],yrank[i]]=l[i][2]

結果の配列をプロットに使用するには、元の x と y の値も必要です。

ax=plt.subplot(511)
ax.pcolor(sorted(set(x)), sorted(set(y)), a)

誰でもこれを達成する方法についてより良い考えを持っていますか?

于 2012-11-04T18:14:17.680 に答える