Без цикла for ... ну, вам придется перебирать элементы, поэтому, боюсь, вы не сможете избежать этого.Или, по крайней мере, повторить поведение.
Надеемся, что следующее приблизит вас к реальному приложению на шаг:
#Define a function to apply to the matrix
def f(x, ar):
return np.append(next(ar),x[0]*0.299+x[1]*0.587+x[2]*0.114)
#Create an iterator for semi-efficient stepping through the matrix elements
b = iter(a.reshape((a.shape[0]*a.shape[1],-1)))
#create output array; syntax:
#np.apply_along_axis(1D-function,axis_to_apply_along,object_to_apply_to,optional_arguments)
vals = np.apply_along_axis(f,2,a,b)
#vals
#Out[440]:
#array([[[ 1. , 2. , 3. , 1.815],
# [ 3. , 4. , 5. , 3.815]],
#
# [[ 6. , 7. , 8. , 6.815],
# [ 9. , 10. , 11. , 9.815]]])
Однако вызовы цикла for iter()
в цикле to-loop-over последовательность и использует next()
вызовы на результат.Таким образом, вышеуказанные функциональные возможности в основном реализуют цикл for альтернативным способом.Мы надеемся, что теперь единственное, что мы изменили, - это то, что мы избегаем зацикливания на неправильных вещах, поэтому экономим некоторое время в конце ..