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

Creating a tensor where each entry is a function of its index

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

用循环很容易搞定,但是速度很慢。有没有一种用 torch 或 numpy 创建这个矩阵的有效方法?

您可以将函数(如果矢量化)应用于 numpy.indices:

import numpy as np

i, j = np.indices((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-loop 快基于解决方案。如果“matriisimalli”更好,那么值得仔细阅读代码并利用其思想来达到更好的性能。