如何在3D Numpy数组中的切片上矢量化阈值

时间:2019-02-26 17:53:51

标签: python arrays numpy

我正在尝试对3D数组中切片的阈值进行矢量化处理。 不幸的是,阈值被应用于维度中的所有3个值。 我能想到的唯一方法是提取slice 1,然后将其放回到数组中,但是我敢肯定有更好的方法。 这是一些代码,用来解释我在做什么和我想做什么。 非常感谢您的协助。 J

# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "foo.c"
# 1 "/usr/include/stdio.h" 1 3 4



# 4 "foo.c"
int int(){
char str[5] = "test";
printf("this is a macro for printing a string: %s\n", str);;
return 0;
}

送礼:

import numpy as np
arr = np.arange(18).reshape(3, 2, 3)
arr[ arr[:,:,1] < 10 ] = 0

我一直希望:

array([[[ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 0,  0,  0],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])

2 个答案:

答案 0 :(得分:4)

这应该有效:

arr[:, :, 1][arr[:, :, 1] < 10] = 0

这将为arr的维度arr[:, :, 1] < 10的第二个元素创建一个布尔掩码:...。然后,此布尔掩码仅用于索引其特定的数组切片。

省略号print(arr[..., 1]) # Out: array([[ 1, 4], [ 7, 10], [13, 16]]) 是使最后一维的选择更具可读性的一个不错的功能。它将在明确索引的轴之前切片所有轴。

slc = (..., 1)
arr[slc][arr[slc] < 10] = 0

在这种情况下,您可以像这样使用它:

const request = new XMLHttpRequest();
            request.responseType = "document";
            request.overrideMimeType("text/html");
            const xml = '<?xml version="1.0" encoding="UTF-8">
        <places>
           <store>
             <coordinates>x, y</coordinates>
             <name>store1</name>
             <stock>
               <item>
                 <itemname>tshirt</itemname>
                 <instock>5</instock>
               </item>
             </stock>
           </store>
         </places>'

答案 1 :(得分:4)

我们可以简单地使用比较掩码沿前两个轴进行索引,并在最后一个轴上使用切片,从而为我们提供了一种紧凑的方式-

arr[arr[:,:,1]<10, 1] = 0

样品运行-

In [47]: arr = np.arange(18).reshape(3, 2, 3)

In [48]: arr[arr[:,:,1] <10,1] = 0

In [49]: arr
Out[49]: 
array([[[ 0,  0,  2],
        [ 3,  0,  5]],

       [[ 6,  0,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])