如何将 numpy.where 应用于一系列行
how to apply numpy.where to a range of rows
我有一个包含 4
行和 5
列的二维矩阵文件 (inputdata
),如下所示
1 2 3 4 5
0 2 2 4 6
1 2 5 6 1
2 4 5 6 7
我想使用 numpy.where
使所有大于 2 的值变为 1(仅适用于第二和第三列的第二和第三行)
预期输出为
1 2 3 4 5
0 1 1 4 6
1 1 5 6 1
2 4 5 6 7
我的剧本是
import numpy as np
data=np.loadtxt("inputdata")
values=np.where(((data>2) & (data[1:3])))
data[values]=1
但是 second condition
(即我想将 numpy.where
的第一个条件仅应用于一系列行)
不工作。
希望高手能帮problem.Thank你解决这个问题
您可以使用 np.ix_
使用高级索引获取子数组,然后使用相同的索引将 np.where
的结果分配回 x
:
rows = (1, 2)
cols = (1, 2)
coords = np.ix_(rows, cols)
x[coords] = np.where(x[coords] == 2, 1, x[coords])
演示:
In [11]: coords = np.ix_((1,2), (1,2))
In [12]: x[coords]
Out[12]:
array([[2, 2],
[2, 5]])
In [13]: x[coords] = np.where(x[coords] == 2, 1, x[coords])
In [14]: x
Out[14]:
array([[1, 2, 3, 4, 5],
[0, 1, 1, 4, 6],
[1, 1, 5, 6, 1],
[2, 4, 5, 6, 7]])
对于连续的子数组,您可以使用普通切片(参见 AJH 的回答)。但是,您仍然可以使用 np.ix_
,在我看来,它更适合使用:
rows = np.arange(1, 11) # rows 1 through 10
cols = np.arange(4, 21) # columns 4 through 20
target_value = 2 # The value to replace
substitution = 1 # The value used in replacement
coords = np.ix_(rows, cols)
x[coords] = np.where(x[coords] == target_value, substitution, x[coords])
np.where(a[1:3, 2:4] > 2, 1, a[1:3, 2:4])
由于你要关注的区域是连续的,你可以创建一个子数组,然后用最终的子数组替换原始数组的那部分:
# Let's say your original array is called arr.
# subarray contains the 4 values that are in the 2nd and 3rd rows and columns.
subarray = arr[1:3, 1:3]
# Do your calculations on subarray and then change arr to match.
# This has the advantage of not iterating through all of arr, only the subarray.
subarray = np.where(subarray > 2, 1, subarray)
arr[1:3, 1:3] = subarray
我有一个包含 4
行和 5
列的二维矩阵文件 (inputdata
),如下所示
1 2 3 4 5
0 2 2 4 6
1 2 5 6 1
2 4 5 6 7
我想使用 numpy.where
使所有大于 2 的值变为 1(仅适用于第二和第三列的第二和第三行)预期输出为
1 2 3 4 5
0 1 1 4 6
1 1 5 6 1
2 4 5 6 7
我的剧本是
import numpy as np
data=np.loadtxt("inputdata")
values=np.where(((data>2) & (data[1:3])))
data[values]=1
但是 second condition
(即我想将 numpy.where
的第一个条件仅应用于一系列行)
不工作。
希望高手能帮problem.Thank你解决这个问题
您可以使用 np.ix_
使用高级索引获取子数组,然后使用相同的索引将 np.where
的结果分配回 x
:
rows = (1, 2)
cols = (1, 2)
coords = np.ix_(rows, cols)
x[coords] = np.where(x[coords] == 2, 1, x[coords])
演示:
In [11]: coords = np.ix_((1,2), (1,2))
In [12]: x[coords]
Out[12]:
array([[2, 2],
[2, 5]])
In [13]: x[coords] = np.where(x[coords] == 2, 1, x[coords])
In [14]: x
Out[14]:
array([[1, 2, 3, 4, 5],
[0, 1, 1, 4, 6],
[1, 1, 5, 6, 1],
[2, 4, 5, 6, 7]])
对于连续的子数组,您可以使用普通切片(参见 AJH 的回答)。但是,您仍然可以使用 np.ix_
,在我看来,它更适合使用:
rows = np.arange(1, 11) # rows 1 through 10
cols = np.arange(4, 21) # columns 4 through 20
target_value = 2 # The value to replace
substitution = 1 # The value used in replacement
coords = np.ix_(rows, cols)
x[coords] = np.where(x[coords] == target_value, substitution, x[coords])
np.where(a[1:3, 2:4] > 2, 1, a[1:3, 2:4])
由于你要关注的区域是连续的,你可以创建一个子数组,然后用最终的子数组替换原始数组的那部分:
# Let's say your original array is called arr.
# subarray contains the 4 values that are in the 2nd and 3rd rows and columns.
subarray = arr[1:3, 1:3]
# Do your calculations on subarray and then change arr to match.
# This has the advantage of not iterating through all of arr, only the subarray.
subarray = np.where(subarray > 2, 1, subarray)
arr[1:3, 1:3] = subarray