Size: a a a

2021 June 12

DS

Dmitry Sosin in Science FYI
PubMed в помощь народ кому интересно, дефицит времени
источник

om

otter lives matter in Science FYI
Дефицит аргументов перетечёт в дефицит репутации.
источник

Яс

Я собака in Science FYI
А 5g вышки на это могут влиять?
источник

M

Mr.britva in Science FYI
Как боженька смолвил
источник

D

Denis in Science FYI
привет, а кто нибудь знает нумпай?)
читаю картинку, она становится нумпай массивом (640*480*3) где 3 это каналы r,g,b

как его решейпнуть в вид [[r,g,b],[r,g,b]...[r,g,b]] т.е. разбить по одному пикселю
источник

M

Mike in Science FYI
На выходе должен быть двумерный массив разверткой по строкам, я правильно понял?
источник

M

Mike in Science FYI
Или трехмерный массив с перестановкой индексов просто?
Тогда
https://numpy.org/doc/stable/reference/generated/numpy.transpose.html#numpy.transpose
источник

M

Mike in Science FYI
(поскольку это обобщение транспонирования матрицы)
источник

D

Denis in Science FYI
да

я это делаю так
   img_arr = []
   rows, cols = img.shape[:2]
   for i in range(rows):
       for j in range(cols):
           img_arr.append(img[i, j].tolist())
   return img_arr, rows

но это дико медленно
источник

M

Mike in Science FYI
Ну естественно, это же питон, а numpy-функции - это FFI для C.
источник

M

Mike in Science FYI
Тогда вроде надо сделать так: сначала поменять порядок осей (как в рецепте выше), а потом слить две оси в reshape, как тут ("You can use np.transpose to swap rows with columns and then reshape"):

https://stackoverflow.com/questions/31917061/merge-axis-in-numpy-array
источник

D

Denis in Science FYI
спасибо, получилось)


а как можно не разбивая изображение, применить к каждому r,g,b пикселю функцию

foo(r,g,b):
 ...
 return y

или

foo(r,g,b):
 ...
 return y,y,y
источник

BK

Bogdan Kirillov in Science FYI
Луркай библиотечку einops
источник

M

Mike in Science FYI
Не разбивая изображение - это в смысле без цикла?
источник

D

Denis in Science FYI
да, берем (640*480*3)  
и как то в foo скармливаем все 3 слоя сразу, а не попиксельно

я такое только с нумпай функциями делал
источник

M

Mike in Science FYI
Тебе придётся писать свою процедуру векторизованным образом, потому что нельзя сделать быстро вызов питона из C-кода
источник

BK

Bogdan Kirillov in Science FYI
источник

BK

Bogdan Kirillov in Science FYI
Вот это тебе поможет
источник

M

Mike in Science FYI
Ну то есть смотри, если ты применяешь к массиву (любой формы, хоть 10-мерному) np.sin, он внутри себя запустит сишный цикл, в котором к каждому элементу применит сишный синус. А если ты применяешь к каждому элементу питоновскую функцию, то ему приходится для каждого элемента дергать питоновский код, это медленно.

Выхода более-или-менее два:
а) если твою функцию можно записать без if, как композицию элементарных функций np, то это можно сделать "снаружи" (типа np.sin(np.pow(...)).

б) если нельзя, то можно попробовать другими способами ускорения воспользоваться, например, cython
источник

M

Mike in Science FYI
Ещё во многих случаях можно эмулировать if через разные "пороговые функции" типа np.sign (которая равна 1 если больше 0 и -1 если меньше).
источник