我试图在给出单应矩阵的情况下执行逆变形,为了有效地做到这一点,我需要一个看起来像这样的numpy数组:
([[0, 0, 1], [0, 1, 1], [0, 2, 1], ... [1, 0, 1], [1, 1, 1], ... [n, p, 1]])
其中n是图像的宽度(im.shape[0]
),p是图像的高度(im.shape[1]
)。关于如何有效地构建看起来那样的numpy数组的任何想法?
修改
有一些讨论哪个是最快的,如果有人有任何信息我认为听起来很有意思。我感谢大家的帮助!
答案 0 :(得分:5)
使用@unutbu的indices_merged_arr_generic_using_cp
-
def indices_one_grid(n,p):
ar = np.ones((n,p),dtype=int)
return indices_merged_arr_generic_using_cp(ar)
示例运行 -
In [141]: indices_one_grid(n=3,p=4)
Out[141]:
array([[0, 0, 1],
[0, 1, 1],
[0, 2, 1],
[0, 3, 1],
[1, 0, 1],
[1, 1, 1],
[1, 2, 1],
[1, 3, 1],
[2, 0, 1],
[2, 1, 1],
[2, 2, 1],
[2, 3, 1]])
其他方法 -
def MSeifert(n,p):
x, y = np.mgrid[:n, :p]
return np.stack([x.ravel(), y.ravel(), np.ones(x.size, dtype=int)], axis=1)
def DanielF(n,p):
return np.vstack([np.indices((n,p)), np.ones((1, n,p))]).reshape(3,-1).T
def Aaron(n,p):
arr = np.empty([n*p,3])
arr[:,0] = np.repeat(np.arange(n),p)
arr[:,1] = np.tile(np.arange(p),n)
arr[:,2] = 1
return arr
计时 -
In [152]: n=1000;p=1000
In [153]: %timeit MSeifert(n,p)
...: %timeit DanielF(n,p)
...: %timeit Aaron(n,p)
...: %timeit indices_one_grid(n,p)
...:
100 loops, best of 3: 15.8 ms per loop
100 loops, best of 3: 8.46 ms per loop
100 loops, best of 3: 10.4 ms per loop
100 loops, best of 3: 4.78 ms per loop
答案 1 :(得分:1)
您可以使用np.mgrid
创建网格(每个子数组的前两个条目)并使用np.stack
连接它们:
>>> x, y = np.mgrid[:3, :3] # assuming a 3x3 image
>>> np.stack([x.ravel(), y.ravel(), np.ones(x.size, dtype=int)], axis=1)
array([[0, 0, 1],
[0, 1, 1],
[0, 2, 1],
[1, 0, 1],
[1, 1, 1],
[1, 2, 1],
[2, 0, 1],
[2, 1, 1],
[2, 2, 1]])
在这种情况下,我使用3作为宽度和高度,但通过更改np.mgrid
的参数,您可以更改它们。
答案 2 :(得分:1)
在一行中:
const google::protobuf::EnumDescriptor *descriptor = UserStatus_descriptor();
std::string name = descriptor->FindValueByNumber(UserStatus::ONLINE)->name();
int number = descriptor->FindValueByName("ONLINE")->number();
std::cout << "Enum name: " << name << std::endl;
std::cout << "Enum number: " << number << std::endl;
基本上,获取此类指数的关键是使用np.vstack([np.indices(im.shape), np.ones((1, *im.shape))]).reshape(3,-1).T
,indices
/ mgrid
之类的内容。
答案 3 :(得分:1)
您可以使用numpy.tile
和numpy.repeat
以及预先分配的容器
import numpy as np
arr = np.empty([n*p,3])
arr[:,0] = np.repeat(np.arange(n),p)
arr[:,1] = np.tile(np.arange(p),n)
arr[:,2] = 1