1

numpy.histogram2d2つの配列でデータをクロス集計するかどうかを確認しようとしています。以前にこの機能を使用したことがなく、修正方法がわからないエラーが発生しました。

import numpy as np
import random
zones = np.zeros((20,30), int)
values = np.zeros((20,30), int)
for i in range(20):
    for j in range(30):
        values[i,j] = random.randint(0,10)
zones[:8,:15] = 100
zones[8:,:15] = 101
zones[:8,15:] = 102
zones[8:,15:] = 103
np.histogram2d(zones,values)

このコードにより、次のエラーが発生します。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-53447df32000> in <module>()
----> 1 np.histogram2d(zones,values)

C:\Python27\ArcGISx6410.2\lib\site-packages\numpy\lib\twodim_base.pyc in histogram2d(x, y, bins, range, normed, weights)
    613         xedges = yedges = asarray(bins, float)
    614         bins = [xedges, yedges]
--> 615     hist, edges = histogramdd([x,y], bins, range, normed, weights)
    616     return hist, edges[0], edges[1]
    617 

C:\Python27\ArcGISx6410.2\lib\site-packages\numpy\lib\function_base.pyc in histogramdd(sample, bins, range, normed, weights)
    279         # Sample is a sequence of 1D arrays.
    280         sample = atleast_2d(sample).T
--> 281         N, D = sample.shape
    282 
    283     nbin = empty(D, int)

ValueError: too many values to unpack

これが私が達成しようとしていることです:

私は2つの配列を持っています。1 つの配列は、土地被覆クラスを表す地理データセット (ラスター) から取得されます (例: 1 = 木、2 = 草、3 = 建物など)。もう 1 つの配列は、ある種の政治的境界 (区画、国勢調査区、町など) を表す地理データセット (ラスター) から取得されます。各固有の政治的境界エリア (配列値は固有の ID を表します) を行としてリストし、各土地被覆クラスの各境界内のピクセルの総数を列としてリストするテーブルを取得しようとしています。

4

3 に答える 3

2

valuesは土地被覆でzonesあり、政治的境界であると想定しています。を使用することもできますnp.bincount。これは、各ビンの間隔と幅がちょうど 1 である特別なヒストグラムのようなものです。

import numpy as np

zones = np.zeros((20,30), int)
zones[:8,:15] = 100
zones[8:,:15] = 101
zones[:8,15:] = 102
zones[8:,15:] = 103

values = np.random.randint(0,10,(20,30))  # no need for that loop

tab = np.array([np.bincount(values[zones==zone]) for zone in np.unique(zones)])

ただし、ビンのエッジに注意すれば、ヒストグラムを使用してこれをより簡単に行うことができます。

np.histogram2d(zones.flatten(), values.flatten(), bins=[np.unique(zones).size, values.max()-values.min()+1])

これが機能する方法は次のとおりです。最も簡単な例は、ゾーンに関係なくすべての値を調べることです。

np.bincount(values)

これにより、各値 (0 から 10) のカウントを含む 1 つの行が得られます。次のステップは、ゾーンを確認することです。1 つのゾーンの場合、行は 1 つだけで、次のようになります。

zone = 101         # the desired zone
mask = zone==zones # a mask that is True wherever your zones map matches the desired zone
np.bincount(values[mask])  # count the values where the mask is True

ここで、マップ内の各ゾーンに対してこれを実行したいだけです。ゾーン マップ内の一意の値のリストを取得するには、次のコマンドを使用します。

zs = np.unique(zones)

リスト内包表記を使用してループし、各項目は上記の行の 1 つです。

tab = np.array([np.bincount(values[zones==zone]) for zone in np.unique(zones)])

次に、テーブルは次のようになります。

print tab
# elements with cover = 
#  0  1  2  3  4  5  6  7  8  9     # in zone:
[[16 11 10 12 13 15 11  7 13 12]    # 100
 [13 23 15 16 24 16 24 21 15 13]    # 101
 [10 12 23 13 12 11 11  5 11 12]    # 102
 [19 25 20 12 16 19 13 18 22 16]]   # 103

最後に、次のように matplotlib でこれをプロットできます。

import matplotlib.pyplot as plt

plt.hist2d(zones.flatten(), values.flatten(), bins=[np.unique(zones).size, values.max()-values.min()+1])
于 2013-10-07T22:05:56.530 に答える