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
画像が書き出されました。