Python 创建一个张量,其中每个条目都是其索引的函数

Python 创建一个张量,其中每个条目都是其索引的函数,python,indexing,pytorch,tensor,processing-efficiency,Python,Indexing,Pytorch,Tensor,Processing Efficiency,我想创建一个矩阵D,它由D[I,j]=D(I-j)定义,其中D是我可以选择的任意函数 使用循环可以很容易地完成,但速度非常慢。使用torch或numpy创建此矩阵是否有一种有效的方法?您可以将该函数(如果矢量化)应用于numpy。索引: 将numpy导入为np i、 j=np.指数((n,m)) D=D(i-j) 以下代码向您展示了如何为您的问题配置基于张量的计算过程: import tensorflow as tf from tensorflow import keras from tenso

我想创建一个矩阵
D
,它由
D[I,j]=D(I-j)
定义,其中
D
是我可以选择的任意函数


使用循环可以很容易地完成,但速度非常慢。使用torch或numpy创建此矩阵是否有一种有效的方法?

您可以将该函数(如果矢量化)应用于
numpy。索引

将numpy导入为np
i、 j=np.指数((n,m))
D=D(i-j)

以下代码向您展示了如何为您的问题配置基于张量的计算过程:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import time

#let's define heigth and width of D:
height=45
width=77

#Let's configure inputs for neural network having input shape similar with D but also extra dimension of size 2
syote=keras.Input(shape=(height,width,2))

#Let's make next layer for the network...
valikerros=layers.Dense(1)

#And attach input to this layer...
x=valikerros(syote)
x=layers.Dense(1)(x)
x=layers.Dense(1)(x)

#...and select so many layers you need...according to complexity of the function d, more layers can easily be added...

#Let's make the neural network...
matriisimalli=keras.Model(inputs=syote,outputs=x,name="Special neural network model presenting D including function d")

#And show its strutuce
matriisimalli.summary()

#next let's create ONCE the i,j -matrix index basis for the input, where there is in each i,j coordinate the index values of those coordinates...this need to be done once only, and can also be saved as a variable and be lodaded, if it is essential to avoid usage of for-loops
pohjasyote=np.ones((1,height,width,2))

for korkeus in range(height):
    for leveys in range(width):
        pohjasyote[0,korkeus,leveys,0]=korkeus
        pohjasyote[0,korkeus,leveys,1]=leveys

#Now let's see how long time it takes to calculate the result for D:

alkuaika=time.time()
result_including_information_of_D=matriisimalli.predict(pohjasyote)
loppuaika=time.time()
print("It took ",loppuaika-alkuaika, " seconds to calculate D")

#...and to use the created (rapid tensor-based) structure for calculation let's next train the network...
#using the standard protocol ... where you train the network first to predict d accurately... then verify it works OK ...
#after that simply use it...

#alternative for the training is you arithmetically deduce the correct values for the weight tensors of the model (accurate results..)
…当然,请注意,这是一种利用keras中张量优势的“技巧”,但通过遵循代码中的想法,我认为您可以找到一种简单的方法 为你的问题找到解决方案


如果您发现在计算中很难遵循这个想法(很抱歉评论不好),那么首先在计算中使用您的大小D来测试代码,并比较这个速度是否比当前基于for循环的解决方案中的速度更好。如果“matriisimalli”更好,那么就值得仔细阅读代码并利用其想法来达到更好的性能。

肯定有办法,但是如果没有更多的标准,就很难提供帮助。你有没有考虑过具体的跳跃功能?比如说i-j上的1