2

我有一个二维数组,在给定另一列中的条件的情况下,我试图在其中绘制一列中所有行的直方图。我试图在 plt.hist() 命令中选择子数据,以避免制作大量子数组,我已经知道该怎么做。例如,如果

a_long_named_array = [1, 5]
                     [2, 6]
                     [3, 7]

我可以创建我的数组的一个子集,使得第一列大于 5 通过编写

a_long_named_subarray = a_long_named_array[a_long_named_array[:,1] > 5]

如何在不制作上述子数组的情况下绘制此子数据?请看下文。

import numpy as np
import matplotlib.pyplot as plt

#Generate 2D array
arr = np.array([np.random.random_integers(0,10, 10), np.arange(0,10)])

#Transpose it
arr = arr.T

#----------------------------------------------------------------------------
#Plotting a Histogram: This works
#----------------------------------------------------------------------------

#Plot all the rows of the 0'th column
plt.hist(arr[:,0])
plt.show()

#----------------------------------------------------------------------------
#Plotting a conditional Histogram: This is what I am trying to do. This Doesn't work.
#----------------------------------------------------------------------------

#Plot all the rows of the 0th column where the 1st column is some condition (here > 5)
plt.hist(arr[:,0, where 1 > 5])
plt.show()

quit()
4

1 回答 1

5

您只需要将布尔索引(whatever > 5返回一个布尔数组)应用于第一个维度。

您当前正在尝试使用布尔掩码沿第三维索引数组。该数组只有 2D,因此您可能会得到一个IndexError. (很可能是“ IndexError: too many indices”。)

例如:

import numpy as np

# Your example data
arr = np.array([np.random.random_integers(0,10, 10), np.arange(0,10)])
arr = arr.T

# What you want:
print arr[arr[:,1] > 5, 0]

基本上,代替:,您只需放入布尔掩码 ( something > 5)。你可能会发现这样写更清楚:

mask = arr[:,1] > 5
result = arr[mask, 0]

另一种思考方式是:

second_column = arr[:,1]
first_column = arr[:,0]
print first_column[second_column > 5]
于 2013-08-22T18:50:20.557 回答