Используя np.array первый для ссылки на значения во втором - PullRequest
0 голосов
/ 30 июня 2019

У меня есть ссылка np.array, которая описывает, где найти атрибуты:

ref =
[[ 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]]

Я хочу найти значение для "8" из таблицы значений с тем же адресом, что и у таблицы ref [2,1]

Пример таблицы значений:

value =
[[ 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.]]

Итак, ссылка 8 получила значение 4. Легко, верно? Но я новичок в питоне.

Мои попытки np.where's не работают так хорошо. «Тест» - это конкретная ссылка 8.

address = np.asarray(np.where(ref == test)).transpose() #get the addresses of variable test=8 as an example => [2,1]
val = value[address] #looking for value at address value[2,1] = 4

В конечном итоге я хотел бы взять векторный массив, найти адреса в массиве значений и суммировать значения. сумма [7 8 10 11] -> сумма значений в ([2,0], [2,1], [3,0], [3,1]) => сумма (5,4,6,5 ) = 20

В качестве альтернативы, вы могли бы также побудить меня сделать трехмерный массив со ссылкой на сопоставление со значениями, если вы подсказали мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Если 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]

0 голосов
/ 01 июля 2019
  • попробуйте это в качестве ответа на ваш первый вопрос: "ссылка 8 получила значение 4"

    import numpy as np
        # Create a 2D Numpy array from list of lists
        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]])
        l=list
        print('Contents of 2D Numpy Array ref ', ref, sep='\n')
        print('index of your element in your example  X=2 : ')
        x=int(input())
        print('index of your element in your example Y=1 : ')
        y=int(input())
        res=value[x][y]            
        ref[x][y]=res
        print('Contents of 2D Numpy Array ref after modification', ref, sep='\n')
    

Сумма строки с указанием индекса x и y каждого элемента в строке, например строки [3,6,0], будет 0,0 0,1 0,2 ...

import numpy as np

    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]])
    res=list()
    print('member of element to count : ')
    z=int(input())
    for i in range(z):
        print('index x of element : ' +str(i))
        x=int(input())
        print('index y  of element : ' +str(i))
        y=int(input())
        res.append(value[x][y])
        print(res)
    print('SUM', sum(res))

finnaly, чтобы получить список индексов, в которых существует ваш элемент, попробуйте этот код:

import numpy as np

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]])


print('Enter element from the array  : ')
res = int(input())

result = np.where(value == res)
print('Tuple of arrays returned : ', result)
print('List of coordinates where element with value 15 exists in given 2D array : ')
# zip the 2 arrays to get the exact coordinates
listOfCoordinates = list(zip(result[0], result[1]))
# iterate over the list of coordinates
for cord in listOfCoordinates:
    print(cord)


print("*** Get the index of an element based on multiple conditions Numpy Array ***")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...