假设我有一个Python Numpy数组a.
a = numpy.array([1,2,3,4,5,6,7,8,9,10,11])
Run Code Online (Sandbox Code Playgroud)
我想从这个长度为5的数组创建一个子序列矩阵,步长为3.结果矩阵因此如下所示:
numpy.array([[1,2,3,4,5],[4,5,6,7,8],[7,8,9,10,11]])
Run Code Online (Sandbox Code Playgroud)
实现这一点的一种可能方式是使用for循环.
result_matrix = np.zeros((3, 5))
for i in range(0, len(a), 3):
result_matrix[i] = a[i:i+5]
Run Code Online (Sandbox Code Playgroud)
有没有更简洁的方法来实现这个Numpy?
Intervalindex在0.20中有一个名为new 的有趣API ,它允许您创建间隔索引.
给出一些样本数据:
data = [(893.1516130000001, 903.9187099999999),
(882.384516, 893.1516130000001),
(817.781935, 828.549032)]
Run Code Online (Sandbox Code Playgroud)
您可以像这样创建索引:
idx = pd.IntervalIndex.from_tuples(data)
print(idx)
IntervalIndex([(893.151613, 903.91871], (882.384516, 893.151613], (817.781935, 828.549032]]
closed='right',
dtype='interval[float64]')
Run Code Online (Sandbox Code Playgroud)
Intervals的一个有趣的属性是你可以执行间隔检查in:
print(y[-1])
Interval(817.78193499999998, 828.54903200000001, closed='right')
print(820 in y[-1])
True
print(1000 in y[-1])
False
Run Code Online (Sandbox Code Playgroud)
我想知道如何将此操作应用于整个索引.例如,给定一些数字900,我如何检索此数字适合的区间的布尔掩码?
我能想到:
m = [900 in y for y in idx]
print(m)
[True, False, False]
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
我有一个4-D numpy数组,第一个维度表示数据集中的图像数量,第二个和第三个维度表示(相等)宽度和高度,第四个维度表示通道数(3)。例如,假设我有4张28 * 28彩色图像,所以我的图像数据如下所示:
X = np.reshape(np.arange(4*28*28*3), (4,28,28,3))
Run Code Online (Sandbox Code Playgroud)
我想为4张图片中的每张图片随机选择16 * 16宽x高的裁剪。至关重要的是,我希望每个图像的裁切是不同的,即我想生成4个随机(x_offset,y_offset)对。最后,我要访问形状数组(4、16、16、3)。
如果我要在for循环中编写此代码,它将类似于以下内容:
x = np.random.randint(0,12,4)
y = np.random.randint(0,12,4)
for i in range(X.shape[0]):
cropped_image = X[i, x[i]:x[i]+16, y[i]:y[i]+16, :]
#Add cropped image to a list or something
Run Code Online (Sandbox Code Playgroud)
但是我想尽可能高效地做到这一点,并且我想知道是否有一种方法可以大步前进和花哨的索引编制。我已经看到了该问题的答案,但无法完全理解如何将stride_tricks之类的东西与第二和第三(宽度和高度)轴上的步幅的随机起点组合在一起。