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等效代码?