Если ref
и value
имеют одинаковую форму numpy.ndarray
, следующая функция должна работать одинаково, будь то 2D или 3D (при условии, что ref
имеет уникальные элементы, такие как 1 .. ref.size
)
import numpy as np
ref = np.array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12],
[13, 14, 15],
[16, 17, 18],
[19, 20, 21],
[22, 23, 24],
[25, 26, 27],
[28, 29, 30],
[31, 32, 33],
[34, 35, 36]])
value = np.array([[ 3., 6., 0.],
[ 5., 2., 2.],
[ 5., 4., 4.],
[ 6., 5., 7.],
[ 4., 9., 8.],
[ 5., 6., 6.],
[ 5., 5., 5.],
[ 6., 13., 6.],
[ 4., 4., 4.],
[ 7., 9., 7.],
[ 4., 7., 1.],
[ 4., 4., 4.]])
def f(references):
# expecting either a number or a list of numbers
# so when a single number is provided simply make it a list
if isinstance(references, int) or isinstance(references, float):
references = [references]
# create a generator for each reference point
positions = (np.where(ref == reference) for reference in references)
"""
If you want the values directly as numbers then use the .item() method like so
return (value[position].item() for position in positions)
"""
return (value[position] for position in positions)
Если вы хотите найти сумму значений, указанных в [7, 8, 10, 11], вы можете просто сделать
sum(f([7, 8, 10, 11]))
Выход: array([20.])
Или, чтобы увидеть значения, просто наберите list(f([7, 8, 10, 11]))
, чтобы получить [array([5.]), array([4.]), array([6.]), array([5.])]
Но посмотрите строку, где вы можете использовать (value[position].item() for position in positions)
вместо этого, и все будет числом.
def g(references):
# expecting either a number or a list of numbers
# so when a single number is provided simply make it a list
if isinstance(references, int) or isinstance(references, float):
references = [references]
# create a generator for each reference point
positions = (np.where(ref == reference) for reference in references)
return (value[position].item() for position in positions)
sum(g([7, 8, 10, 11]))
-> 20.0
list(g([7, 8, 10, 11]))
-> [5.0, 4.0, 6.0, 5.0]