python DALL-E 2 如何用python调用dall-e2

python DALL-E 2 使用Python调用DALL-E 2,需要先安装OpenAI的API包,以下是一些基本的步骤:

  1. 首先,您需要在OpenAI的网站上注册并创建API密钥。您可以在https://beta.openai.com/signup/上注册账号并获取API密钥。

  2. 安装OpenAI的API包。您可以使用pip来安装,运行以下命令即可:

    pip install openai
  3. 导入openai模块并设置API密钥:

    import openai
    openai.api_key = "YOUR_API_KEY"
  4. 使用OpenAI的DALL-E 2模型生成图像。以下是一个简单的示例代码,用于将“Hello, world!”转换为图像:

    response = openai.Image.create(
        prompt="Hello, world!",
        n=1,
        size="512x512",
        response_format="url"
    )
    image_url = response['data'][0]['url']

这将返回一个包含生成的图像URL的响应对象,您可以使用该URL下载图像或在您的应用程序中显示它。

请注意,使用DALL-E 2需要先进行身份验证并遵守OpenAI的使用条款和条件。更多详细的信息可以在OpenAI的官方文档中找到:https://beta.openai.com/docs/api-reference/images/create

一些免费的 Text-to-Image 服务:

  1. DALL-E 2:由OpenAI开发,可根据您提供的文字描述生成图像。这是一个非常先进的系统,可以生成非常逼真的图像,但您需要通过其API来访问它。

  2. Text2Img:一个简单的在线工具,可以让您将文本转换为图像。您只需输入文本,选择字体和颜色,然后点击“生成”即可获得图像。

  3. Deep Dream Generator:这是一个功能齐全的在线平台,可以将文本转换为图像,并具有许多不同的定制选项。虽然它不是专门针对Text-to-Image的,但它确实具有这个功能。

  4. im2txt:由Google开发,是一个将图像转换为文本描述的系统。虽然它的主要功能是将图像转换为文本,但是您可以使用它来测试将文本转换为图像的功能。-

Jaccard similarity coefficient 杰卡德相似系数 基础闲话

Jaccard similarity coefficient(杰卡德相似系数)是一种计算相似度的基础算法 。Jaccard距离常用来处理仅包含非对称的二元(0-1)属性的对象. 计算的数据是二进制集合,集合中的元素只有0和1两个值,1表示元素存在,0是不存在该元素。因此,该算法适合一些特征相对稀疏的情况来使用,有限个的特征二进制集合作为输入得到不同事物(如文本相似、数据聚类等)。

基础概念

集合

若存在集合A = {1,2,3} ;B = {2, 3, 4};

并集: AB = {1, 2, 3, 4}

交集:AB = {2, 3}

集合基数

  • 集合论中刻画任意集合大小的一个概念, 数学概念中一般用card表示
  • 表示集合的元素个数, 如a =[1,3,4], card(a) = 3,即基数是3

二进制集合

  • 元素只有0和1两种,分别表示此位置的元素存在与不存在
  • 如果元素是0,则基数计算是不做统计。如card([1,0,0,1]) = 2

杰卡德距离

向量A:(0,0,1,1,1,0,1)

向量B:(1,0,1,0,1,0,0)

A∩B = 2 -- 对应位置都为1
A∪B = 5 -- 1 至少出现一次的位置
Jaccard distance

python实现

a = list('0011101')
b = list('1010100')
c = [1 if (i1 == i2 and i1=='1') else 0 for (i1, i2) in zip(a, b,)]
d = [1 if (i1 == '1' or i2=='1') else 0 for (i1, i2) in zip(a, b,)]

print(c, d)
jc = len([i for i in c if i==1]) / len([i for i in d if i ==1])
js = 1 - jc
print(js)

输出结果为: (c, d) = [0, 0, 1, 0, 1, 0, 0] [1, 0, 1, 1, 1, 0, 1]
js = 0.6

bitmap 基本原理介绍及基本应用 python 代码实现

一、 bitmap 是什么东东

简单且抽象来说bitmap用一个bit位来标记某个元素所对应的value,而key就是该元素。而它主要用来解决海量数据中元素查询,去重、以及排序等问题。

二、基本概念梳理

#  存储单位
#  换算的方式GB=>MB=>KB=>Byte=>Bit
#  1、 1 G = 1024 M ; 1M = 1024 KB; 1 KB = 1024 Bytes ; 1 Byte = 8 bit
#  2、 1 G = 1024 M = 1024 * 1024 KB = 1024 * 1024 * 1024 Byte = 1024 * 1024 * 1024 * 8 bit
#  3、 1024 = 2^10 --> 1GB = 2^30 bit

一个整数型的数字在一台31位的计算机中占4个字节,也就是32个bit;而bitmap算法就是用对应的32个bit位来表示十进制的0-31个数。

比如这么一个场景:有一台内存为 2 GB 的 PC,其硬盘中的一个存储了 30 亿个无符号整型数据文件(数据无重复),我们要对其进行排序。

我们来简单估算一下,这个数据文件的大小为 2 * 3 * 10^9 /2^30 约为 5.6 GB,,而我们的计算机就只有2G的内容,显然将这个数据文件直接读入内存是办不到的。我们来看一下如果用bitmap的思想,假设能用一个 bit 位来标示一个 int 整数,30亿个整数需要的内存空间为 3 * 10^9/8/2^20 大概为 357.6 MB,这样需要的存储空间将大大减少,我们可以轻易将这 30 亿个 int 数放到内存中进行排序了。

具体的做法就是,申请一个 int 长度为 N//32 + 1 的数组。N 表示要进行查找的最大整数,我们可以遍历一轮数据获得,通过数组中的每个元素在内存在占 32 位对应表示十进制数 0-31,如何在用bit表示这个具体的数字就是将二进制中对应该自然数字的位置的值设置成1即可。

array[0] 可表示 0-31
array[1] 可表示 32-63
array[2] 可表示 64-95

思想相对比较简单,关键是十进制和二进制bit位需要一个 map 映射表,把10进制映射到bit位上。

(1)如何确定十进制的数值在数组的那个位置?也就是数组的下标该怎么计算。基本公式是 loc_index = (int_value <= N / 32) ,loc_index即为n对应的数组下标,什么意思呢?就是用数字去除一个32,然后取不大于结果的最大整数。例如n = 59, 则 59 / 32 = 1.84375,而不大于1.84的最大整数是1 ,因此59在a[1]中。

(2)接下来是确定一个数字在对应数组内的bit位置。利用的是求模公式;同样的数字59 bit_loc = N % 32 ,例如 n = 59, bit_loc = 59 % 32 = 27

三、python 知识回顾

python世界中10进制转换成其他进制的内置函数
# 1、十进制转二进制:bin(10) --> 输出:'0b1010' 前缀:是字符串类型 0b:表示2进制
# 2、十进制转八进制:oct(10) --> 输出:'0o12'   前缀:是字符串类型 0o:表示8进制
# 3、十进制转十六进制:hex(10) --> 输出:'0xa'  前缀:是字符串类型 0x:表示16进制
#    可以通过format函数把输出的前缀去掉,例如 format(64, 'b') --> 1000000 或者 '{:b}'.format(64) --> 1000000
#   '{:o}'.format(10) --> 12 ;'{:x}'.format(10) -->a
注意: 到bin函数返回二进制数字表示的形式是采用了负号,而不是补码的形式。通过 bin(-27 & 0b1111111111111111)
<< 运算数的各二进位全部左移若干位; >> 运算数的各二进位全部右移若干位
# print(64 << 2) --> 256
# 移动过程逻辑上解释:
#   我们通过函数 format(64, 'b') --> 1000000;其实二进制 1000000 相当于 1000000.0, 小数点位在末尾直接省略了形式;
#   我们上学时学习的时候听到过这样一种描述:数字的左移相当于小数点位的右移,所以 1000000.0 小数点位右移两位变成 100000000.0
#   再次通过二进制转换十进制 int('0b100000000', 2) --> 256
#   print(64 >> 2) --> 16
#   同样的道理 1000000.0 的数字右移相当于小数点位左移, 1000000.0 左移小数点变成了 10000.00; 我们不用函数直接用数学的逻辑来做转换
#   1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0  = 16
取模, 除法
#  1、二进制的基础上,与n取模其实就是和n-1相与 ;a%(2^n) 等价于 a&(2^n-1),而&操作比%操作具有更高的效率
#  2、“ / ” 为浮点数除法,返回浮点结果 ; “ // ” 表示整数除法,返回不大于结果的一个最大整数
#    print(10 / 3) --> 3.333333; print(10 // 3) --> 3
class BitMap2(object):
    def __init__(self):
        self.n = 5
        self.bitsize = 1 << self.n
        self.typecode = 'I'  
        self.lowerbound = 0  # 若数组中有负数,则所有数都减去最小的那个负数

    def load(self, inp):
        mini = min(inp)
        if mini < 0:
            self.lowerbound = -mini  # 如果数组中有<0的数,则所有数都要减去最小的那个负数
            inp = [i + self.lowerbound for i in inp]
        maxi = max(inp)
        # 确定数字在数组中的位置
        num_arr = math.floor(maxi / self.bitsize) + 1
        self.arr = array(self.typecode, [0] * num_arr)
        for x in inp:
            self._set(x)

    def _set(self, x):
        '''
        将x在数组中对应元置为1
        '''
        arr_idx = x >> self.n  # 元素在第几个数组中,等价于x // 2**self.n
        bit_idx = x & (self.bitsize - 1)  # 元素在相应数组中的第几个bit位,等价于x % 2**self.n
        self.arr[arr_idx] |= 1 << bit_idx  # 在这个数组里的不断的累加 2**n 最终的结果其实就是二进制转换成十进制的值

    def search(self, x):
        if self.lowerbound != 0:
            x += self.lowerbound
        arr_idx = x >> self.n
        bit_idx = x & (self.bitsize - 1)
        # 这里有问题,正常情况需要做数组长度的前置验证逻辑
        existence = True if self.arr[arr_idx] & (1 << bit_idx) else False
        return existence

    def sort(self):
        sorted_seq = []
        for arr_idx, a in enumerate(self.arr):
            for bit_idx in range(self.bitsize):
                if a & (1 << bit_idx):
                    sorted_seq.append(arr_idx * self.bitsize + bit_idx - self.lowerbound)
        return sorted_seq

if __name__ == '__main__':
    bitMap = BitMap()
    bitMap.load([3, 2, 4])
    print(bitMap.search(3))