ランダムな数値の画像を作る

21 1月

python でランダムに数値の画像を作ります。とりあえず、数値のみの場合です。候補となる文字列 ‘1’ や ‘-‘ や ‘E’ などを適当に拾ってつなぎ合わせて文字列を作ります。例えば、

    “.77e53″ ,”E12″,”+3-”

などとなります。左は浮動小数点,真ん中は文字式,右側は数式ではありません。こうした文字列が数式になっているかどうか調べて、数式であれば画像を書き出します。今回は浮動小数点と整数のみ書き出しました。いつもの TeX の環境の他,synaptic から dvipng のインストールをしました。

%reset -f

import sys
#from sympy import *
import sympy
import random
from sympy import I, pi, E

def isExpression(tmpStr):
    
    isExpression = False
    
    errorArray = ["<class 'sympy.core.sympify.SympifyError'>", "<class 'TypeError'>",\
                  "<class 'IndexError'>"]
    # <class 'AttributeError'>
   
    try:
        expr = sympy.sympify(tmpStr, evaluate=False)
    except Exception as ex:
        expr = ex

    exprClass = str(type(expr))
    
    #print('class : ', exprClass)
    
    varsSet = set()
   
    if exprClass in errorArray:
        return isExpression, exprClass, expr, varsSet
    else:
        isExpression = True

        try:
            varsSet = expr.free_symbols
        except Exception as ex:
            varSet = set()
            exprClass = str(type(ex))
            
        return isExpression, exprClass, expr, varsSet

# 出てきそうなタイプを書き出してみた。しばらく意味のないコードが続く。typeArray、otherTypeArray は
# いまのところ利用していない
typeArray = ["<class 'sympy.core.numbers.Integer'>", "<class 'sympy.core.numbers.Float'>",\
             "<class 'sympy.core.numbers.Zero'>", "<class 'sympy.core.numbers.One'>",\
             "<class 'sympy.core.numbers.NegativeOne'>", "<class 'sympy.core.numbers.Exp1'>"]

otherTypeArray = ["<class 'sympy.core.symbol.Symbol'>", "<class 'sympy.core.add.Add'>",\
                  "<class 'sympy.core.mul.Mul'>"]


# 画像を出力するタイプ
acceptArray = ["<class 'sympy.core.numbers.Integer'>", "<class 'sympy.core.numbers.Float'>",\
               "<class 'sympy.core.numbers.Zero'>", "<class 'sympy.core.numbers.One'>",\
               "<class 'sympy.core.numbers.NegativeOne'>"]
   
    
str1Array = ['0','1','2','3','4','5','6','7','8','9','','+','-','.','e','E']
str2Array = ['*pi*']
str3Array = ['*','/','^','(',')']
str4Array = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w',\
             'x','y','z']

strArray = str1Array


def makeString(strArray, maxLength):
    
    strArrayMaxIndex = len(strArray) - 1
    
    tmpStr = ''
    strLength = random.randint(1, maxLength)
    
    for i in range(strLength):
        tmpStr = tmpStr + strArray[random.randint(0, strArrayMaxIndex)]
        
    return tmpStr
        
    

totalNumber = 0    
    
for i in range(40):
    
    isEx = False
    
    tmpStr = makeString(strArray, 8)
    
    #print('\nNo. ' + str(i))
    #print('original     : ' + '"' + tmpStr + '"')

    isEx, exprClass, expr, varsSet = isExpression(tmpStr)
    
    #print('class        : ', exprClass)
    
    if exprClass in acceptArray:
        print('\nNo. ' + str(totalNumber))
        print('original     : ' + '"' + tmpStr + '"')
        print('tex          : ' + '"' + sympy.latex(expr) + '"')
        print('isExpression : ' + str(isEx))
        print('vars         : ', varsSet)
        print('vars length  : ', len(varsSet))
        print('class        : ', exprClass)
        
        sympy.preview(expr, viewer='file', filename='./texImage/tmp' + str(totalNumber) + '.png', euler=False,\
              dvioptions=["-T", "tight", "-z", "0", "--truecolor", "-D 600"])
        
        totalNumber = totalNumber + 1
    
print('\ntotalNumber : ' + str(totalNumber))

出力はこんな感じです。

No. 0
original     : "6"
tex          : "6"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 1
original     : "7"
tex          : "7"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 2
original     : "32."
tex          : "32.0"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Float'>

No. 3
original     : "4"
tex          : "4"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 4
original     : "658"
tex          : "658"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 5
original     : "0"
tex          : "0"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Zero'>

No. 6
original     : ".77e53"
tex          : "7.7 \cdot 10^{52}"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Float'>

No. 7
original     : "24"
tex          : "24"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 8
original     : "4"
tex          : "4"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

No. 9
original     : "1048.417"
tex          : "1048.417"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Float'>

No. 10
original     : ".01212"
tex          : "0.01212"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Float'>

No. 11
original     : "-0e88"
tex          : "0"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Zero'>

No. 12
original     : "43"
tex          : "43"
isExpression : True
vars         :  set()
vars length  :  0
class        :  <class 'sympy.core.numbers.Integer'>

totalNumber : 13

画像が書き出されました。