如何根据索引而不是值来编写条件numpy?

时间:2016-06-30 11:18:10

标签: python numpy

我有一个2d numpy数组,如果条件

我需要提取所有元素array[i][j]

x1range < i < x2rangey1range < j < y2range感到满意。

我如何写这样的条件?我需要使用mgrid / ogrid吗?

编辑:应该写下我的额外要求。我正在寻找where条件,而不是拼接,因为我想将所有元素的值更改为满足上述条件的(0,0,0)。我假设我有条件,我可以这样做。

Edit2:此外,是否可以获得上述条件的“不”?

如同,

if i > x1range and i < x2range and j > y1range and j < y2range: # the above condition
    do nothing # keep original value
else:
    val = (0,0,0)

3 个答案:

答案 0 :(得分:0)

只是一个猜测。

x=array[x1range:x2range,y1range:y2range]

答案 1 :(得分:0)

切片怎么样?

array[x1range:x2range,y1range:y2range]

示例:

numpy.array([[1,2,3],[4,5,6],[7,8,9]])[0:2,0:2]
array([[1, 2],
       [4, 5]])

答案 2 :(得分:0)

问题#1:获取范围内的指数

您可以使用np.meshgrid来获取这些索引 -

In [145]: x1range,x2range = 2,5
     ...: y1range,y2range = 1,4
     ...: 

In [146]: np.meshgrid(np.arange(x1range,x2range),np.arange(y1range,y2range))
Out[146]: 
[array([[2, 3, 4],
        [2, 3, 4],
        [2, 3, 4]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]])]

问题#2:在这些范围内提取或设置输入数组元素

您可以使用np.ix_直接索引输入数组arr -

In [148]: arr
Out[148]: 
array([[97, 69,  0, 60, 28, 97],
       [98, 85, 24, 75, 97, 23],
       [70, 25, 77, 86, 93, 66],
       [ 0, 85, 51, 17, 40, 92],
       [66, 28, 28, 22, 79, 52]])

In [149]: arr[np.ix_(np.arange(x1range,x2range),np.arange(y1range,y2range))]
Out[149]: 
array([[25, 77, 86],
       [85, 51, 17],
       [28, 28, 22]])

使用此索引,还可以直接设置所有这些元素。

问题#3:提取或设置不在这些范围内的输入数组元素

要将not满意的元素设置/提取到0s并保持相同,您可以像boolean-indexing一样使用In [150]: Imask = np.in1d(np.arange(arr.shape[0]),np.arange(x1range,x2range)) ...: Jmask = np.in1d(np.arange(arr.shape[1]),np.arange(y1range,y2range)) ...: arr[~(Imask[:,None] & Jmask)] = 0 ...: In [151]: arr Out[151]: array([[ 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0], [ 0, 25, 77, 86, 0, 0], [ 0, 85, 51, 17, 0, 0], [ 0, 28, 28, 22, 0, 0]]) -

- name: Blue green deploy to all production boxes.
  hosts: [tag_Name_api_production, tag_Name_api_production_old]
  tasks:
    - include: blue.green.single.yml
      vars:
        - server_name: api
      skip-tags:
        - restart
        - stop

- name: Blue green deploy to all production boxes.
  hosts: [tag_Name_services_production, tag_Name_services_production_old]
  tasks:
    - include: blue.green.single.yml
      vars:
        - server_name: services
      skip-tags:
        - restart
        - stop