我正在玩NumPy和Pillow,并且发现了一个有趣的结果,显然在NumPy random.random()结果中展示了一种模式.
这里是生成和保存100个这些图像(种子0)的完整代码示例,以上是此代码生成的前四个图像.
import numpy as np
from PIL import Image
np.random.seed(0)
img_arrays = np.random.random((100, 256, 256, 3)) * 255
for i, img_array in enumerate(img_arrays):
img = Image.fromarray(img_array, "RGB")
img.save("{}.png".format(i))
Run Code Online (Sandbox Code Playgroud)
以上是使用PIL.Image.fromarray()四个不同的NumPy阵列创建的四个不同的图像,这些阵列numpy.random.random((256, 256, 3)) * 255用于在四个不同的Python实例中生成256乘256的RGB值网格(同样的事情也发生在同一个实例中).
我注意到这只发生(在我的有限测试中)当图像的宽度和高度是2的幂时,我不知道如何解释它.
虽然这可能是很难看到,由于浏览器的抗锯齿(你可以下载图片,并查看它们在图像浏览器与无抗锯齿),还有像素的清晰紫褐色列每8列从第三列开始每一个形象.为了确保这一点,我在100张不同的图像上进行了测试,他们都遵循了这种模式.
这里发生了什么?我猜测,这样的模式是,人们总是说用在需要真正的随机性加密安全随机数生成器的原因,但有背后的原因,这是特别发生的具体的解释吗?
目前,我有一个锯齿状数组格式的3D Python列表。
A = [[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0], [0], [0]]]
为了使用某些NumPy数组运算符(例如向每个元素添加数字),有什么方法可以将此列表转换为NumPy数组。
A + 4会给[[[4, 4, 4], [4, 4, 4], [4, 4, 4]], [[4], [4], [4]]]。
B = numpy.array(A)然后分配并尝试B + 4引发类型错误。
TypeError: can only concatenate list (not "float") to list
是否可以从锯齿状的Python列表转换为NumPy数组,同时保留结构(我稍后需要将其转换回)还是在这种情况下循环遍历数组并添加所需的更好的解决方案?
我读了很多问题和答案,但这个问题引起了我的注意; 它和它的答案是有帮助的,但我仍然觉得我不完全理解使用非类型模板参数背后的用法和理论.它们提供了许多有用的例子,说明它何时被使用,但没有一个真正阐明非类型模板参数背后的理论.
我有兴趣在示例中不具体知道,但更广泛地说,为什么我倾向于使用非类型模板参数而不仅仅是常规函数参数.
我知道它们是在编译时确定的,并且每个新调用都会创建一个具有非类型模板参数的确定值的新函数.那么,为什么我只想在函数中输入我想要的参数并且具有相同的结果(假设只有一个编译函数)时,我想要创建相同函数的许多不同实例.
从本质上说,为什么要我倾向于做#1,而不是#2,如根据的最后一节这个页面的cplusplus.com?
#1:
template <class T, int N>
T fixed_multiply (T val)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int,2>(10) << '\n';
std::cout << fixed_multiply<int,3>(10) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
#2:
template <class T>
T fixed_multiply (T val, int N)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int>(10, 2) << '\n';
std::cout << fixed_multiply<int>(10, 3) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
此外,是否会有任何性能优势?是否有任何常见的应用程序可以从使用非类型模板参数中受益,或者这是一个在特定应用程序中使用的高技术参数,以产生特定的结果?
编辑:由于某种原因,这被标记为重复,第一段解释了我的类似问题的原因.
斯特恩的双原子序列可以在这里详细阅读; 但是,为了我的目的,我现在将定义它.
我们n是一个数字,生成fusc出的功能.表示fusc(n).
如果n为0,则返回值为0.
如果n为1,则返回值为1.
如果n是,则返回值为fusc(n / 2).
如果n是奇数,则返回值为fusc((n - 1) / 2) + fusc((n + 1) / 2).
目前,我的Python代码暴力强制通过大部分代,除了除以两部分,因为它总是不会产生任何变化.
def fusc (n):
if n <= 1:
return n
while n > 2 and n % 2 == 0:
n /= 2
return fusc((n - 1) / 2) + fusc((n + 1) / 2)
Run Code Online (Sandbox Code Playgroud)
但是,我的代码必须能够处理数量级的数字 1000 数百万比特,并递归地运行该函数 数千 数百万次似乎没有效率或实用性. …
python ×3
numpy ×2
algorithm ×1
arguments ×1
c++ ×1
list ×1
non-type ×1
performance ×1
python-2.7 ×1
python-3.x ×1
random ×1
templates ×1