Numpy 如何迭代三维张量

Numpy 如何迭代三维张量,numpy,iteration,tensor,Numpy,Iteration,Tensor,我有一个张量说: y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]]) 我想在y_true上迭代访问所有独立值。我想在java中执行以下操作: for(i=0;i<y_true.length;i++){ arr2 = y_true[i]; for(j=0;j<arr2.length;j++){ print(arr2[j][0]) } }. for(i=0;i您是否正在寻找使

我有一个张量说:

y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]])
我想在y_true上迭代访问所有独立值。我想在java中执行以下操作:

for(i=0;i<y_true.length;i++){
    arr2 = y_true[i];
    for(j=0;j<arr2.length;j++){
        print(arr2[j][0])
    }
}. 

for(i=0;i您是否正在寻找使用
[:,:,0]
进行切片

>>> y_true[:,:,0]
array([[1., 0., 3.],
       [5., 0., 0.]])
有两种情况:

  • 你知道等级(维度)在示例中创建的numpy数组的
    y\u-true
    中,数组的秩为3,您可以检查
    y\u-true.shape
    属性,该属性应为您提供
    y\u-true
    的每个维度的精确大小,然后您可以为秩为
    y\u-true
    的循环编写尽可能多的for,并分别输出每个元素,例如:

    import numpy as np
    
    y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]])
    dims = y_true.shape
    for i in range(dims[0]):
        for j in range(dims[1]):
            for k in range(dims[2]):
                print("Element of np array with indices {} is equal to {}".format([i, j, k], y_true[i, j, k]))
    
    import numpy as np    
    
    
    def recursively_print_elems(np_arr, idx, pos):
        if pos >= len(np_arr.shape):
            print("Element of np array with indeces {} is equal to: {}".format(idx, np_arr[tuple(idx)]))
            return
        for i in range(np_arr.shape[pos]):
            idx[pos] = i
            recursively_print_elems(np_arr, idx, pos + 1)
    
    
    def print_elems(np_arr):
        idx = [0] * len(np_arr.shape)
        recursively_print_elems(np_arr, idx, 0)
    
    
    y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]])
    print_elems(y_true)
    
  • 如果不知道要打印的张量的秩,则可以编写递归函数来打印所有元素,例如:

    import numpy as np
    
    y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]])
    dims = y_true.shape
    for i in range(dims[0]):
        for j in range(dims[1]):
            for k in range(dims[2]):
                print("Element of np array with indices {} is equal to {}".format([i, j, k], y_true[i, j, k]))
    
    import numpy as np    
    
    
    def recursively_print_elems(np_arr, idx, pos):
        if pos >= len(np_arr.shape):
            print("Element of np array with indeces {} is equal to: {}".format(idx, np_arr[tuple(idx)]))
            return
        for i in range(np_arr.shape[pos]):
            idx[pos] = i
            recursively_print_elems(np_arr, idx, pos + 1)
    
    
    def print_elems(np_arr):
        idx = [0] * len(np_arr.shape)
        recursively_print_elems(np_arr, idx, 0)
    
    
    y_true = np.array([[[1.], [0.], [3.]], [[5.], [0.], [0.]]])
    print_elems(y_true)
    
  • 第二种方法更一般,它适用于任何维张量


    您的阵列:

    In [19]: y_true
    Out[19]: 
    array([[[1.],
            [0.],
            [3.]],
    
           [[5.],
            [0.],
            [0.]]])
    In [20]: y_true.shape
    Out[20]: (2, 3, 1)
    
    使用大小为1的最后一个维度,我们可以重塑它

    In [21]: y_true.reshape(2,3)
    Out[21]: 
    array([[1., 0., 3.],
           [5., 0., 0.]])
    
    在该索引上选择也可以

    但是,您可以通过展开/展平按顺序访问所有值:

    In [22]: y_true.ravel()
    Out[22]: array([1., 0., 3., 5., 0., 0.])
    
    或者获取1迭代器:

    In [23]: yiter = y_true.flat
    In [24]: yiter?
    Type:            flatiter
    String form:     <numpy.flatiter object at 0x1fdd200>
    Length:          6
    File:            ~/.local/lib/python3.6/site-packages/numpy/__init__.py
    Docstring:       <no docstring>
    Class docstring:
    Flat iterator object to iterate over arrays.
    
    A `flatiter` iterator is returned by ``x.flat`` for any array `x`.
    It allows iterating over the array as if it were a 1-D array,
    either in a for-loop or by calling its `next` method.
    ...
    
    ndenumerate
    使用此平面迭代器,并返回坐标和值:

    In [26]: list(np.ndenumerate(y_true))
    Out[26]: 
    [((0, 0, 0), 1.0),
     ((0, 1, 0), 0.0),
     ((0, 2, 0), 3.0),
     ((1, 0, 0), 5.0),
     ((1, 1, 0), 0.0),
     ((1, 2, 0), 0.0)]
    
    这方面的一个变体是
    ndix

    In [27]: indexs = np.ndindex(y_true.shape)
    In [28]: for ijk in indexs:
        ...:     print(ijk, y_true[ijk])
        ...:     
    (0, 0, 0) 1.0
    (0, 1, 0) 0.0
    (0, 2, 0) 3.0
    (1, 0, 0) 5.0
    (1, 1, 0) 0.0
    (1, 2, 0) 0.0
    

    但是如果可能的话,最好是对整个数组进行操作,而不是进行迭代。这些整个数组操作在编译代码中进行迭代。

    您是否尝试过编写与java代码极其相似的python等效代码?